unix - 在文件中搜索精确的多个模式并在模式匹配时删除行

标签 unix sed awk grep

例如,一个包含以下内容的文件,其中不包含任何重复条目:

100
10012
12345
12387
123
123456344

我想在上面的文件中搜索 10012345 并在模式匹配时删除该行。

我也想在一个命令中做到这一点。

最佳答案

我会简单地做

egrep -v '^(100|12345)$' file.in > file.out

或者,使用 sed
sed -n '/^\(100\|12345\)$/!p' file.in > file.out

你甚至不需要第二个文件:
sed -ni '/^\(100\|12345\)$/!p' file.in

(请参阅评论;严格来说,会创建一个临时文件,然后替换输入文件,但这对用户来说是透明的)

如您所见,正则表达式或多或少保持不变(除了您不需要在 egrep 中转义 ()|)。如果一行中有多个单词,但只想匹配整个单词,则可以使用以下 sed 正则表达式:
sed -n '/\<\(100\|12345\)\>/!p' file.in > file.out

这将匹配行 100 , 123 100 123但不是 123 100123 .

使用 grep 获得相同的行为,使用 -w选项(感谢 Janito):
egrep -wv '(100|12345)' file.in > file.out

关于unix - 在文件中搜索精确的多个模式并在模式匹配时删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12894762/

相关文章:

linux - AWK 匹配在本地工作但不在 debian 服务器上的 bash 中

macos - 批量删除文件扩展名 OSX

bash - bash 是否有办法在不取消设置的情况下取消导出变量?

shell - 日期转换不起作用

linux - 用 sed 替换 ® 字符

python - 位于指定范围内的值的数量

linux - 使用 awk 替换列

bash - 在 bash 脚本中转义 sed 字符串

linux - 在 Linux 中操作文本文件

regex - 使用特定的正则表达式从一个巨大的重复文件中提取特定行