【问题标题】:Search a string in a file and delete it from this file by Shell Script [duplicate]在文件中搜索字符串并通过 Shell 脚本将其从该文件中删除 [重复]
【发布时间】:2011-07-31 20:50:04
【问题描述】:

我想从文件中删除包含特定字符串的行。如果不使用awk,我怎么能做到这一点?我尝试使用sed,但无法实现。

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    应该这样做:

    sed -e s/deletethis//g -i *
    sed -e "s/deletethis//g" -i.backup *
    sed -e "s/deletethis//g" -i .backup *
    

    它将在所有文件 (*) 中将所有出现的“deletethis”替换为“”(无),并就地编辑它们。

    在第二种形式中,可以更安全地编辑模式,它可以备份任何修改过的文件,方法是使用“.backup”作为后缀。

    第三种形式是sed 的某些版本喜欢它的方式。 (例如 Mac OS X)

    man sed 了解更多信息。

    【讨论】:

    • 我认为引用表达式通常是一个更好的主意,此外我想指出 -i.bak 语法,其中 sed 创建具有给定扩展名的备份文件。 IE。也可以是-i.backup...
    • @STATUS 你是对的,有些版本的 sed 实际上需要后缀。
    • 这不起作用。这会删除字符串。我想删除包含此字符串的行
    • 它确实有效。它回答了你的问题。如果你想简单地删除包含某个字符串的行,你可以使用grep -v
    • 这在busibox中工作,而sed -i '/pattern/d'没有(删除所有行,而不是字符串)
    【解决方案2】:
    sed -i '/pattern/d' file
    

    使用 'd' 删除一行。这至少适用于 GNU-Sed。

    如果您的 Sed 没有选择就地更改文件,也许您可​​以使用中间文件来存储修改:

    sed '/pattern/d' file > tmpfile && mv tmpfile file
    

    直接写到源代码通常是行不通的:sed '/pattern/d' file > file,所以如果您怀疑,请在尝试之前复制一份。

    【讨论】:

    • 这是对原始问题的正确答案。出于安全原因,您可以使用-i.bak 而不是仅使用-i 来创建原始文件的备份。
    • 这不适用于busybox的sed,它删除了所有行而不是字符串,@mvds 回答有效
    • @danigosa:嗯,这就是为什么 mvds 的答案是错误的,问题是要删除一行,而不是字符串。阅读问题,阅读投票最多的答案中的美德评论。
    • 不适用于 macOS。不得不做sed 's/pattern//g'
    • @pedromss:那是删除一个单词,而不是包含该单词的行。
    【解决方案3】:

    试试 vim 方式:

    ex -s +"g/foo/d" -cwq file.txt
    

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 2021-07-08
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 2016-08-02
      • 2014-05-21
      • 1970-01-01
      • 2020-08-23
      相关资源
      最近更新 更多