我正在尝试使用 grep 从文本文件中获取特定范围的行;行范围需要由两个变量来标识。到目前为止,我一直在尝试使用通配符“*”来完成此操作,失败尝试的示例包括:(我可以明白为什么前两个不起作用)
grep "$Var1"*"$Var2" file.txt
grep "$Var1*$Var2" file.txt
echo "$Var1*$Var2" | grep file.txt
答案1
grep
不适用于搜索多行模式。还有其他更适合此任务的工具:awk
和sed
。
由于您使用变量来保存模式,事情可能会变得棘手。请首先尝试使用硬编码模式。如果你做对了,那么尝试用变量替换硬编码模式。
使用awk
:
awk '/'"$Var1"'/,/'"$Var2"'/' file.txt
使用硬编码模式的相同命令来解释这个概念:
awk '/pattern1/,/pattern2/' file.txt
解释:
/pattern1/,/pattern2/
是一个范围。范围从匹配的行开始pattern1
,到匹配的行结束pattern2
。- 默认情况下
awk
仅打印范围内的行。
学习更多关于awk
:http://www.catonmat.net/blog/awk-one-liners-explained-part-one/
使用sed
:
sed -n '/'"$Var1"'/,/'"$Var2"'/ p' file.txt
使用硬编码模式的相同命令来解释这个概念:
sed -n '/pattern1/,/pattern2/ p' file.txt
解释:
-n
使 sed 仅在被告知时才打印行。/pattern1/,/pattern2/
是一个范围。范围从匹配的行开始pattern1
,到匹配的行结束pattern2
。对于该范围内的每一行,都会执行以下命令。- 最后
p
的 告诉sed
打印行。
学习更多关于sed
:http://www.catonmat.net/blog/sed-one-liners-explained-part-one/
如果你确实必须使用grep
那么你可以使用-P
告诉grep
使用perl正则表达式引擎。手册页对此功能有这样的描述:
将该模式解释为与 Perl 兼容的正则表达式 (PCRE)。这是高度实验性的,grep -P 可能会警告未实现的功能。