使用两个变量作为开始和结束参数从文本文件中获取一个范围

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)

les*_*ana 5

grep不是为了在多行上搜索模式。还有其他更适合此任务的工具:awksed.

由于您使用变量来保存模式,因此事情可能会变得棘手。请先尝试使用硬编码模式。如果你猜对了,那么尝试用变量替换硬编码模式。


使用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只打印范围内的行。

了解更多awkhttp : //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印刷线条。

了解更多sedhttp : //www.catonmat.net/blog/sed-one-liners-explained-part-one/


如果你真的必须使用grep那么你可以使用-Pto tellgrep使用 perl 正则表达式引擎。手册页有关于该功能的说明:

将模式解释为 Perl 兼容的正则表达式 (PCRE)。这是高度实验性的, grep -P 可能会警告未实现的功能。