【问题标题】:Delete whole line containing multiple words in command line在命令行中删除包含多个单词的整行
【发布时间】:2013-03-02 16:40:49
【问题描述】:

我试图删除包含列表中任何单词的文本中的行。例如:

文件 1:

xxx yyy, zzz,
aaa bbb, sss,
ccc fff, zzz,
rrr www, qasd,

文件 2:

xxx
zzz
rrr

目标是删除file1中包含file2中任何单词的行。 所以输出应该是:

aaa bbb, sss,  

我知道如何将 sed 与单个单词一起使用,例如 sed '/zzz/d' 来删除包含 zzz 的行。但它是如何在多个单词或文件中的单词中工作的呢?

【问题讨论】:

    标签: text command-line sed


    【解决方案1】:

    您可以使用grep 轻松做到这一点:

    $ grep -Fwvf file2 file1
    aaa bbb, sss,
    

    选项:

    -f 文件,--file=文件

    从 FILE 中获取模式,每行一个。空文件包含零个模式,因此 什么都不匹配。 (-f 由 POSIX 指定。)

    -v, --invert-match

    反转匹配的感觉,选择不匹配的行。 (-v 由 POSIX 指定。)

    -w, --word-regexp

    仅选择那些包含构成整个单词的匹配项的行。测试是 匹配的子字符串必须在行首,或者前面有一个非单词 构成性状。同样,它必须位于行尾或后跟 非单词组成字符。构成单词的字符是字母、数字和 下划线。

    -F, --固定字符串

    将 PATTERN 解释为固定字符串的列表,由换行符分隔,其中任何一个都是 匹配。 (-F 由 POSIX 指定。)

    将更改存储回file1

    $ grep -Fwvf file2 file1 > tmp && mv tmp file1
    

    【讨论】:

    • 它.. 有点... 有风险的是 file2 中有一行像 'r.r' 甚至是 'r.*'
    • 那么它与@Kent 不匹配,您的答案是相同的,但没有选项说明或将更改存储回文件?
    • 它将匹配,并且在您修复之前我的并不相同。现在它们是一样的。
    • 你的固定版本应该没问题。 +1
    • 前面的没有结果,但是这个有效,谢谢!
    【解决方案2】:

    试试这个:

    grep -vFwf file2 file1
    

    【讨论】:

      猜你喜欢
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2023-03-24
      • 2019-01-04
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      相关资源
      最近更新 更多