3

我正在尝试使用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给我行号吗?如果是这样,第一行还是第二行?

我应该使用awkorsed代替,如果是的话怎么办?

4

1 回答 1

2

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

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

请注意,这不仅仅打印行号。根据pcregrep手册页,它还打印匹配的行。

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

sed -n '/^firstLine/=' myFile

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

只打印结束行号:

sed -n '/^secondLine/=' myFile

要获得两者之间的任何一条线:

sed -n '/^firstLine/,/^secondLine/=' myFile

awk也可以使用。线路选择类似。打印行号的命令不同。例如:

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

将行号捕获到变量中

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

lineNumber=$(awk '/^firstLine/ {print NR}' myFile)

但是,如果有两个或更多行号,那可能对您没有用处。在这种情况下,如果您使用支持数组的 shell,例如bash,您可能更愿意将行号捕获到数组中,如下所示:

lineNumbers=($(awk '/^firstLine/ {print NR}' myFile))

如果您不熟悉数组,请注意诸如此类的语句echo $lineNumbers不会显示整个数组,只会显示其第一个元素。要查看整个数组,请运行:

declare -p lineNumbers
于 2014-07-02T02:02:58.943 回答