使用grep或其他命令行工具我需要过滤列表,以便排除包含以下一个或多个字符的每一行:
.
/
-
'
[space]
我在搜索多个问题时很难逃脱特殊字符。
这不起作用:
grep -v '(.|/|-|'| )' input > output
答案 0 :(得分:1)
默认情况下,grep
命令使用" Basic"正则表达式格式。你写的正则表达式是"扩展"格式。您可以告诉grep使用带有-E
选项的扩展格式。
你的正则表达式中包含一个点。请记住,一个点匹配"任何"字符。要逃避其正常行为,您可以使用反斜杠(\.
)或将其置于范围([.]
)中进行转义。我更喜欢后一种表示法,因为我发现反斜杠使得阅读起来更加困难。选择是你的。
你的表达中有一个引号。在您编写它之后,命令行无法工作,因为嵌入的单引号退出以第一个单引号开头的字符串。你可以用双引号括起你的正则表达式来解决这个问题。
你也不需要这个正则表达式的外括号。
所以......你可以用Basic表示法编写整个内容:
grep -v "[.]\|/\|-\|'\| " input > output
或者您可以用扩展表示法编写它:
grep -Ev "[.]|/|-|'| " input > output
或者,您可以将所有这些字符放入一个范围内,在Basic和Extended中以相同的方式编写:
grep -v "[./' -]" input > output
请注意,连字符已移至范围的END,因此不会被解释为"正斜杠和单引号之间的字符范围"。另请注意,由于此范围也与Basic RE表示法兼容,因此我删除了-E
选项。
有关详细信息,请参阅man re_format(7)
。