如何在grep中转义管道字符?

8

我有一个文件,格式如下:

coupait ||| eastern ||| 0.045454545454545456 2.718 ||| 0-0 ||| 
instaurer ||| characteristic ||| 5.797101449275362E-4 2.718 ||| 0-0 |||
tiendrait ||| fails ||| 0.005 2.718 ||| 0-0 |||

我希望能够搜索保存在两个变量中以 ||| 分割的一对单词。我尝试了很多方法,但都没有成功,例如:

grep "$word1 ||| $word2 |||" $file

我试过像这样转义管道符:

grep '$word1 \|\|\| $word2 \|\|\|' $file

如何在文件中匹配管道符号?
1个回答

7

使用grep -F - 变量将由shell解释并替换为它们各自的值,然后带引号的字符串(包括管道)将被解释为固定字符串。例如:

$ cat file.txt
coupait ||| eastern ||| 0.045454545454545456 2.718 ||| 0-0 ||| 
instaurer ||| characteristic ||| 5.797101449275362E-4 2.718 ||| 0-0 |||
tiendrait ||| fails ||| 0.005 2.718 ||| 0-0 |||
$ word1=coupait
$ word2=eastern
$ grep -F "$word1 ||| $word2 |||" file.txt
coupait ||| eastern ||| 0.045454545454545456 2.718 ||| 0-0 ||| 

将搜索词用引号括起来对我很有效。谢谢。 - Markus Zeller
我强烈推荐使用-F选项,以便轻松转义模式内的各种字符。在这里,我引用了你在执行man grep命令时可能会遇到的定义: -F 将PATTERN解释为固定字符串列表(而不是正则表达式),由换行符分隔,匹配其中任何一个。 在我看来,这非常友好和美观 :). - ivanleoncz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接