【发布时间】:2019-05-02 13:56:59
【问题描述】:
我在编写 perl 脚本方面比较新鲜,所以我提出这个问题或支持,下面是代码
start pattern1
line1
Matching pattern can be here
line2
Matching Pattern can be here
line3
line4
...
end pattern1
.
start pattern1
line1
line2
start pattern1
start pattern1
line1
Matching pattern can be here
line2
start pattern1
所以从 perl 我需要 grep 开始模式 1 ... 结束模式 1 之间的行, 为此,我使用 awk 命令来 grep
$cmd = q(awk '/start pattern1/,end pattern1 /' x.file );
$n1 = system($cmd);
这个输出工作正常,下面是输出,
start pattern1
line1
**Matching pattern can be here**
line2
**Matching Pattern can be here**
...
end pattern1
但是在文件中我有 1000 行这样的行,所以我需要 grep 那些具有匹配模式的行。即我只需要 grep 那些起始模式行到结束模式行有匹配的模式
为此我尝试了
$cmd = q(awk '/start pattern1/,end pattern1 /' x.file | grep '$n2\|line4');
$n1 = system($cmd);
但是当我使用上述命令时,我没有看到任何输出 这里 $n2 包含一些从另一个文件中提取的模式。
如果我使用直接匹配模式代替 $n2 效果很好,为什么我不能在这里使用 $n2?
注意:我在 perl 脚本中使用这个
从 Awk 命令中,我得到了起始模式 1...结束模式 1 之间的所有行,但我有 1000 个这样的打印,所以我需要开始模式 1 的行到结束模式 1 的匹配匹配模式
我这样做时的预期输出是,
start pattern1
line1
Matching pattern can be here
line2
Matching Pattern can be here
line3
line4
...
end pattern1
start pattern1
line1
Matching pattern can be here
line2
start pattern1
【问题讨论】:
-
如果您尝试在 perl 脚本中执行此操作,则无需使用 awk 或 grep。只需使用内置的 perl 功能。
-
@RamCharan,cmets 不是为了解释问题,请用适当的细节更新您的问题,然后让我们知道。
-
你问的问题的答案是
q()不插入变量,但是整个代码很糟糕,应该扔掉。 -
@RamCharan 如果你需要更新一个 perl 脚本,你需要学习 perl。仅仅因为您不知道语法而从任何语言调用 system() 都是不好的做法。
-
awk | grep 是一种反模式。在 perl 中调用 awk 是一种反模式。在 perl 中调用 awk 管道到 grep 是反物质的,可能会导致已知宇宙的破坏。