linux - 如何使用换行符或制表符或空格来 grep 多行字符串

标签 linux shell perl grep

我的测试文件有这样的文本:

> cat test.txt
new dummy("test1", random1).foo("bar1");
new dummy("
        test2", random2);
new dummy("test3", random3).foo("bar3");
new dummy = dummy(
            "test4", random4).foo("bar4");

我正在尝试匹配所有以分号 (;) 结尾并包含文本“dummy(”) 的单行。然后我需要提取出现在 dummy 内双引号中的字符串。我想出了以下命令,但是它只匹配第一条和第三条语句。

> perl -ne 'print if /dummy/ .. /;/' test.txt | grep -oP 'dummy\((.|\n)*,'
dummy("test1",
dummy("test3",

使用 -o 标志,我希望在 dummy 中的双引号之间提取字符串。但这也行不通。你能告诉我如何继续吗?

预期输出是:

test1
test2
test3
test4

下面的一些答案适用于基本文件结构。如果 lines 包含超过 1 个换行符,则代码中断。例如输入换行符较多的文本文件:

new dummy("test1", random1).foo("bar1");
new dummy("
        test2", random2);
new dummy("test3", random3).foo("bar3");
new dummy = dummy(
            "test4", random4).foo("bar4");
new dummy("test5",
        random5).foo("bar5");
new dummy("test6", random6).foo(
        "bar6");
new dummy("test7", random7).foo("
        bar7");

我提到了以下 SO 链接:

How to give a pattern for new line in grep?

how to grep multiple lines until ; (semicolon)

最佳答案

@TLP 非常接近:

perl -0777 -nE 'say for map {s/^\s+|\s+$//gr} /\bdummy\(\s*"(.+?)"/gs' test.txt
test1
test2

使用

  • -0777 将文件作为单个字符串插入
  • /\bdummy\(\s*"(.+?)"/gs 查找所有在 "dummy("之后被引用的字符串内容(在引号前有可选的空格)
    • s 标志允许 . 匹配换行符。
    • 任何包含转义双引号的字符串都会破坏这个正则表达式
  • map {s/^\s+|\s+$//gr} 去除每个字符串的前导/尾随空格。

关于linux - 如何使用换行符或制表符或空格来 grep 多行字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71874725/

相关文章:

linux - 为什么 svmlight 中的训练和测试文件相同

python - O_NONBLOCK 不会在 Python 中引发异常

shell - 将Redis 添加到/etc/services 最优雅的方式是什么?

perl - 如何在 Perl 中使用 Bless 运算符?

perl - 你如何在 Perl 中使用 ImageMagick?

perl - 从 Perl 文本 block 中提取一个人的全名?

PHP 读取控制台输出

linux - 加载栏 - Bash 脚本

linux - Bash/SH,相同的命令不同的输出?

PHP 在运行后台进程的 bash 脚本上调用 shell_exec 超时