我正在尝试使用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
,如果是,请如何使用?
答案 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