使用pcregrep -M搜索多行字符串

时间:2014-07-01 22:59:00

标签: bash awk sed grep pcregrep

我正在尝试使用pcregrep -M来搜索多行字符串。

这是我脚本中的一行:

lineNumber=$(pcregrep -Mn '$firstLine.*\n.*$secondLine.*' $myFile)

myFile包含多行格式:

firstLine\n  
secondLine(with other characters here that I don't need to match)

我为lineNumber得到一个空字符串,这就是全部。

我做错了什么?

我应该对返回值有什么期望?我不应该-n给我一个行号吗?如果是这样,哪个行号,第一个还是第二个?

我应该使用awk还是sed,如果是,请如何使用?

1 个答案:

答案 0 :(得分:2)

首先,需要一个工作正则表达式。如果我正确理解你的要求,这将有效:

pcregrep -Mn '^firstLine.*\n^secondLine'  myFile

请注意,这打印的不仅仅是行号。根据{{​​1}}手册页,它还会打印匹配的行。

如果您只想打印起始行号,请尝试:

pcregrep

正则表达式sed -n '/^firstLine/=' myFile 选择第一行,命令/^firstLine/告诉=打印行号。

仅打印结束行号:

sed

获取两者之间的任何一行:

sed -n '/^secondLine/=' myFile

sed -n '/^firstLine/,/^secondLine/=' myFile 也可以使用。线路选择类似。打印行号的命令不同。例如:

awk

将行号捕获为变量

可以使用命令替换将行号捕获到变量中:

awk '/^firstLine/ {print NR}' myFile

但是,如果有两个或更多行号,则可能对您没用。在这种情况下,如果您使用的是支持数组的shell,例如lineNumber=$(awk '/^firstLine/ {print NR}' myFile) ,您可能更喜欢将行号捕获到数组中,如下所示:

bash

如果您不熟悉数组,请注意lineNumbers=($(awk '/^firstLine/ {print NR}' myFile)) 之类的语句不会显示整个数组,只会显示第一个元素。要查看整个数组,请运行:

echo $lineNumbers