如何匹配使用grep在两个字符之间找到变量的行?

时间:2014-02-22 12:22:39

标签: regex bash grep

我需要输出一个文件中的所有行,其中BASH变量$a位于字母“A”和“Z”之间,也在同一行。

A the cat went to the river Z
The A cat then Z swam to the lake.
Then the cat A ate Z some fish.

如果$a设置为“cat”,则只会输出这些行,因为在这些行的两个字符之间找到“cat”:

A the cat went to the river Z
The A cat then Z swam to the lake.

如果$a设置为“then”,则只输出此行,因为在两个字符之间找到“then”:

The A cat then Z swam to the lake.

我试过这些,但没有一个有效:

grep "A*[$a]+*Z" file.txt

grep "A(.*)[$a]+(.)Z" file.txt

grep "[A]+*[$a]+*[Z]+" file.txt

如何使用grep或类似的BASH工具匹配在两个字符之间找到变量的行?

4 个答案:

答案 0 :(得分:1)

这应该有效:

grep "A.*$a.*Z" file.txt

这假设$a不包含任何在正则表达式中具有特殊含义的字符。

您的所有尝试都使用[$a],这是完全错误的。 [chars]匹配单个字符,该字符是括号内chars中的任意一个。

答案 1 :(得分:1)

尝试以下命令:

egrep  "\b(A)\b.*[\$a].*\b(Z)\b" * --color 

这不适用于以下文字:

A the cat went $a to the river Z and A goes to $a for Z reason.

此正则表达式为您提供A the cat went $a to the river Z and A goes to $a for Z作为输出。

答案 2 :(得分:1)

awk解决方案

awk '$0~"A.*"x".*"Z' x=$a file
A the cat went to the river Z
The A cat then Z swam to the lake.

答案 3 :(得分:0)

您应该只能使用grep或egrep。

grep "$a" filename.txt

或者如果我理解得那么你想确保每一方至少有一个角色那么这会更好

egrep ".+$a.+" filename.txt

grep -P ".+$a.+" filename.txt