我需要输出一个文件中的所有行,其中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工具匹配在两个字符之间找到变量的行?
答案 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