【问题标题】:sed or perl Remove outer parentheses only if first inner word matchessed 或 perl 仅当第一个内部单词匹配时才删除外部括号
【发布时间】:2011-09-03 13:25:00
【问题描述】:

使用 GNU sed,我需要删除像 (click here ....) 这样的括号短语,包括括号。 click here 后面的文字各不相同,但我需要删除整个外括号。

我尝试了以下多种变体,但似乎无法找到正确的变体:

sed -e 's/\((click here.*[^)]*\)//'

编辑 愚蠢的是,我没有注意到括号中的字符串中间经常有换行符,所以sed 可能不起作用。示例:

(click here to
enter some text)

【问题讨论】:

    标签: regex perl bash sed


    【解决方案1】:

    这是另一种sed 方法,它将完整的输入保存在保持缓冲区中:

    # see http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/
    echo '
    ()
    (do not delete this)
    ()
    (click here to
    enter some text)
    ()
    ' | 
    sed -n '1h;1!H;${;g;s/(\([^)]*\))/\1/g;p;}'
    

    【讨论】:

      【解决方案2】:

      使用 perl 你可以运行:

      perl -00 -pe "s/\(click here [^)]*\)//g" inputfile > outputfile
      

      它将读取字符串中的输入文件,然后替换所有出现的(click here anychar but '(' ),然后在输出文件中全部输出。

      【讨论】:

      • @Michael:它将记录分隔符定义为空,因此整个文件以单个字符串读取。
      【解决方案3】:

      如果没有嵌套的括号,也许您可​​以尝试以下方法:

      sed -e 's/(click here [^)]*)//'
      

      【讨论】:

      • 这会导致删除click here 和紧随其后的任何单个单词,留下剩余的单词和括号。例如(click here to enter text) 变为 ( enter text)
      • @Michael,可能不是。至少它在这里工作。无论如何,我刚刚发现你不需要逃避括号。我相应地编辑了答案。
      • @Michael:你能提供一个它不起作用的测试用例吗?考虑:echo "This is a test of the (click here to enter text) system" | sed -e 's/(click here [^)]*)//' 请注意,如果在一行上可能出现多次点击,您可能希望在最后一个 / 之后添加一个 g。
      • @Seth Robertson 我刚刚发现这不起作用并捂脸。在我正在测试此操作的文件中,换行符有时会出现在括号字符串的中间。
      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 2021-11-03
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多