【问题标题】:Sed delimiter not playing nice with GrepSed 分隔符与 Grep 不兼容
【发布时间】:2012-12-13 17:18:45
【问题描述】:

将 grep 与 sed 结合使用时,只要使用标准的正斜杠分隔符,一切都可以。

find . -maxdepth 2 -xdev -type f -exec grep -i "teststring" -l {} \; -exec sed -i '/./d' {} \;

如果我将它更改为另一个字符,如“+”或“#”,它不起作用(我需要更改它,因为测试字符串可能包含“/”字符并导致错误。

find . -maxdepth 2 -xdev -type f -exec grep -i "teststring" -l {} \; -exec sed -i '#.#d' {} \;

这个问题有办法解决吗?

【问题讨论】:

  • 等一下。你为什么使用 grep 和 sed?告诉我们您要做什么,因为无论是什么,都有更好的方法!
  • 查找所有存在测试字符串的文件并(有几种变体)删除文件内容/删除行/或删除字符串。

标签: linux sed grep


【解决方案1】:

这与 不适合 无关,如果您真的无法更改分隔符,那么只需使用反斜杠 \ 转义所有 / 实例:

sed -i '/\//d'

但是sed -i '\#/#d' 这样做了,这将删除所有包含/ 的行。

您应该告诉我们您要做什么,因为我觉得这里根本不需要

【讨论】:

    【解决方案2】:

    根据sed's man page,任何字符都可以用作行匹配正则表达式,语法为\cregexpc,其中c是任何字符。

    find . -maxdepth 2 -xdev -type f -exec grep -i "teststring" -l {} \; -exec sed -i '\#.#d' {} \;
    

    【讨论】:

      【解决方案3】:

      第一个分隔符需要反斜杠

      有时用于 sed(例如 OSX)的 BSD 手册页并没有说明清楚,但仅当 RE 前面有反斜杠时,对 sed 正则表达式地址使用任意分隔符才有效。

      \xMATCHTHISxd
      

      这将删除某处包含MATCHTHIS 的行。

      【讨论】:

        【解决方案4】:

        如果你想在sed删除命令中使用不同的分隔符,你需要用反斜杠开始地址,像这样:

        sed -i '\#.#d'
        

        【讨论】:

        • 如果用法是这样的:'s\#searchstring#replacementstring#gI'我得到一个错误:未终止的's'命令。如果有正常的分隔符,我不会出错。知道为什么吗?
        • 搜索和替换时不需要反斜杠,即s#searchstring#replacementstring#g 可以工作。
        【解决方案5】:

        您似乎正在尝试清空任何包含测试字符串的文件。那就是:

        find . -maxdepth 2 -xdev -type f | 
        while IFS= read -r file; do
           if grep -i "teststring" -q "$file"; then
              > "$file"
           fi
        done
        

        如果您只想删除那些至少包含一个字符的行,那就是:

        find . -maxdepth 2 -xdev -type f | 
        while IFS= read -r file; do
           if grep -i "teststring" -q "$file"; then
              sed -i '/^./d' "$file"
           fi
        done
        

        如果你想删除那些包含一些字符串“foo”的行,那就是:

        find . -maxdepth 2 -xdev -type f | 
        while IFS= read -r file; do
           if grep -i "teststring" -q "$file"; then
              sed -i '/foo/d' "$file"
           fi
        done
        

        只要遵循这个模式,你想做的任何事情都是微不足道的,假设你没有包含换行符的文件名。如果你愿意,你可以将 grep 移到 find 行,但这似乎有点没有意义,而且会混淆代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-20
          • 2013-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-02
          • 2011-12-03
          相关资源
          最近更新 更多