我的测试文件有如下文本:

> 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");

我正在try 匹配以分号(;)结尾的所有单行还有文本"dummy(".然后我需要提取dummy中双引号中的字符串.我想出了以下命令,但它只匹配第一个和第三个语句.

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

使用-o标志,我希望在dummy中的双引号之间提取字符串.但这也不起作用.你能告诉我怎么做吗?

预期输出为:

test1
test2
test3
test4

下面的一些答案适用于基本的文件 struct .如果行包含超过1个新行字符,则代码中断.e、 g.输入包含更多新行字符的文本文件:

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");

我提到了以下几个链接:

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"((在开头引号之前有可选的空格)之后查找所有带引号的字符串内容
  • map {s/^\s+|\s+$//gr}修剪每个字符串的前导/尾随空格.

Linux相关问答推荐

在Bluez/Linux中,周期性与连续蓝牙设备发现的已知缺陷是什么?

为什么仅使用&i-i标志时仍会从容器进程中输出

Shell 脚本程序 - 从日志(log)文件中过滤磁盘空间利用率超过 80% 的行

eBPF:仅使用系统调用加载 eBPF 程序并将其附加到 sys_enter_execve

为什么waitpid(2)可以指定非子进程?

JSON 转义 CURL/JQ 输出

在 bash 脚本中保持两个进程处于活动状态(并在死亡时重生它们)

Linux PREEMPT_RT:SCHED_OTHER 的性能优于 SCHED_FIFO.为什么?

删除一行和它之前的一行

如何找出哪个进程正在消耗等待 CPU(即 I/O 阻塞)

如何获取 CPU 使用率

diff 命令仅获取不同行的数量

按主机名的 IPv6 地址

-zxvf 在 tar -zxvf <文件名> 中是什么意思?

带有 curl 的 Linux 脚本来判断 Web 服务是否已启动

如何设置errno值?

ldconfig 错误:使用 Linux 加载程序时不是符号链接

Bash:在文件中的特定位置插入一行

在类 Unix 系统中上次运行的 cron 作业(job)的详细信息?

更改 /etc/profile 后,我需要做什么来重置我的 shell?