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

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

我正在尝试使用 grep 从文本文件中获取特定范围的行;行范围需要由两个变量来标识。到目前为止,我一直在尝试使用通配符“*”来完成此操作,失败尝试的示例包括:(我可以明白为什么前两个不起作用)

grep "$Var1"*"$Var2" file.txt     
grep "$Var1*$Var2" file.txt
echo "$Var1*$Var2" | grep file.txt

答案1

grep不适用于搜索多行模式。还有其他更适合此任务的工具:awksed

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


使用awk

awk '/'"$Var1"'/,/'"$Var2"'/' file.txt

使用硬编码模式的相同命令来解释这个概念:

awk '/pattern1/,/pattern2/' file.txt

解释:

  • /pattern1/,/pattern2/是一个范围。范围从匹配的行开始pattern1,到匹配的行结束pattern2
  • 默认情况下awk仅打印范围内的行。

学习更多关于awkhttp://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打印行。

学习更多关于sedhttp://www.catonmat.net/blog/sed-one-liners-explained-part-one/


如果你确实必须使用grep那么你可以使用-P告诉grep使用perl正则表达式引擎。手册页对此功能有这样的描述:

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

相关内容