Gil*_*les 3 grep text-processing variable
我正在尝试使用 grep 从文本文件中获取特定范围的行;行范围需要由两个变量来标识。到目前为止,我一直在尝试使用通配符 '*' 尝试失败的例子包括:(我明白为什么前两个不应该工作)
grep "$Var1"*"$Var2" file.txt
grep "$Var1*$Var2" file.txt
echo "$Var1*$Var2" | grep file.txt
Run Code Online (Sandbox Code Playgroud)
grep
不是为了在多行上搜索模式。还有其他更适合此任务的工具:awk
和sed
.
由于您使用变量来保存模式,因此事情可能会变得棘手。请先尝试使用硬编码模式。如果你猜对了,那么尝试用变量替换硬编码模式。
使用awk
:
awk '/'"$Var1"'/,/'"$Var2"'/' file.txt
Run Code Online (Sandbox Code Playgroud)
使用硬编码模式的相同命令来解释这个概念:
awk '/pattern1/,/pattern2/' file.txt
Run Code Online (Sandbox Code Playgroud)
解释:
/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
Run Code Online (Sandbox Code Playgroud)
使用硬编码模式的相同命令来解释这个概念:
sed -n '/pattern1/,/pattern2/ p' file.txt
Run Code Online (Sandbox Code Playgroud)
解释:
-n
使 sed 仅在被告知时打印行。/pattern1/,/pattern2/
是一个范围。范围从匹配行开始,到匹配行pattern1
结束pattern2
。对于该范围内的每一行,将执行以下命令。p
在年底告诉sed
印刷线条。了解更多sed
:http : //www.catonmat.net/blog/sed-one-liners-explained-part-one/
如果你真的必须使用grep
那么你可以使用-P
to tellgrep
使用 perl 正则表达式引擎。手册页有关于该功能的说明:
将模式解释为 Perl 兼容的正则表达式 (PCRE)。这是高度实验性的, grep -P 可能会警告未实现的功能。