grep用于多个字符串,每个字符串都有一个转义管道

时间:2015-06-18 13:06:33

标签: regex bash

我在Windows中使用Gitbash。我想grep一组字符串,每个字符串以|

结尾

我想我可以用反斜杠单独做每个人来逃避管道:

grep abcdef\| filename.tsv

但是要把它们全部放在一起我最终得到:

grep 'abcdef\|\|uvwxyz\|' filename.tsv

失败了。有什么想法吗?

我可以单独执行每个字符串,然后连接生成的文件,但这需要几天时间。

3 个答案:

答案 0 :(得分:4)

ERE可能是最佳选择,以便于阅读。

egrep '(abcdef|uvwxyz)[|]' filename.tsv

这使您可以更轻松地管理字符串列表,并通过将尾随垂直条放在一个范围内来“转义”它。 (这也适用于圆点,星号等。)

如果系统上没有egrep,您可以检查现有的grep是否包含-E扩展正则表达式的选项。

答案 1 :(得分:2)

在基本的posix正则表达式中 - 由grep使用 - 你不能逃避文字|。但是,如果将|用作正则表达式语法元素来指定备选方案,则需要转义grep 'abcdef|\|uvwxyz|' filename.tsv

以下表达式应该有效:

<input name="name"
data-bind="name" -> typo maybe? no data-binding declaration like these
data-value-field="id" -> double init, you have it on your ComboBoxEditor function dataValueField: valuefield,
data-text-field="name" -> double init, you have it on your ComboBoxEditor function dataTextField: textfield,
data-role="combobox" />

答案 2 :(得分:2)

这里有两种竞争效果,您可能会感到困惑。首先,|必须进行转义或引用,以便shell不解释它。其次,根据您使用的正则表达式模式,无论是文字字符还是元字符,转义/取消管道都会发生变化。

我建议您将模式更改为:

grep 'abcdef|\|uvwxyz|' file

在基本的正则表达式模式下,转义管道\|是正则表达式OR,因此它匹配模式后跟文字管道。

或者,如果您的所有模式都以管道结尾并且您只有两个,那么您可以使用它:

grep -E '(abc|def|ghi)\|' file

在扩展模式下,转义管道会产生相反的效果,因此此模式匹配任何字母序列,后跟文字管道。