【问题标题】:Why Sed cannot replace lines that contains . + and *为什么 Sed 不能替换包含 . + 和 *
【发布时间】:2017-10-02 14:12:26
【问题描述】:

我有一个大文件,其中一些行如下:

....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*

我想用 ...+PUNCT 替换 ....+UNKNOWN 部分

为此,我做了以下操作:

sed 's/\.\.\.\.\+\*UNKNOWN\*/\.\.\.\+PUNCT/g' myfile.out > myfile_result.out

但是,没有一条线消失。

grep -F '...+*UNKNOWN*' myfile.out 

....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*
....    ....+*UNKNOWN*

我找不到我的错误,你能帮我解决一下吗?

【问题讨论】:

  • 您不能只在正则表达式中的每个非字母字符前面加上一个反斜杠,然后寄希望于最好的结果。您需要识别哪些字符是文字​​字符,哪些是元字符,哪些成为元字符通过转义它们并在您使用的任何工具的上下文中以及您提供的任何选项中适当地使用它们那也是。

标签: linux file sed


【解决方案1】:

sed的某些版本中,\+有特殊含义,使用+来匹配加号。

【讨论】:

  • /+ 是什么意思?
  • \+ 表示“一次或多次”,因此它类似于*,但必须至少匹配一次。
【解决方案2】:

sed 中的\+ 表示在“+”之前的表达式的一个或多个匹配项,表示没有+ 文字。
要匹配文字 '+' ,请使用 + 匹配文字中的加号。

修饰表达式:

sed 's/\.\.\.\.+\*UNKNOWN\*/\.\.\.\+PUNCT/g' myfile.out > myfile_result.out

【讨论】:

    【解决方案3】:

    请您尝试关注一下。

    sed 's/+\*UNKNOWN/+PUNCT/'  Input_file
    

    +举例说明:

    echo "This is an example: 123 test 123" | sed -E  's/^[^0-9]*([0-9]+).*/\1/'
    123
    

    假设我们有一行This is an example: 123 test 123,所以这里[0-9]+ 将匹配第一组数字,然后将它们保存在sed 的内存中,我使用\1(在这里再次转义 1 让sed 知道这是我在这里调用的内存序列。

    【讨论】:

    • @EdMorton,为此道歉,我现在已经改变了它们。非常感谢您一如既往的指导先生。