尝试删除两个字符串之间的字符串,同时省略字符串 if - sed

尝试删除两个字符串之间的字符串,同时省略字符串 if - sed

当尝试删除字符串末尾和字符 ; 之间的字符串时,我遇到了一些麻烦。目前看来我也在其他行上拾取该字符串,因为该字符串也在 end 和 ; 之间。我一直试图从命令中省略 if 字符串,但当我收到错误时,我似乎没有太多地使用下面的 sed 命令。字符串触发器名称是需要删除的内容,但它的命名方式并不一致。

之前的示例文件:

end if;
    end triggername ;

预期的示例文件:

end if;
    end;

我一直在尝试使用的命令是:

sed -i -e '/if/! s/\(end.*)\;/g' test

我希望/if/!将省略下一个命令中的所有文字 if 字符串,但是当我尝试运行它时,我收到以下错误:

sed: -e expression #1, char 20: unterminated `s' command

谁能帮我理解为什么我会收到这个错误?如果 sed 命令基本正确,如果不正确,您会建议如何改进它。

更新1:

谢谢你!正如建议的那样,我尝试在末尾添加一个额外的 / ,因为我只是要求将其删除而不是替换。但现在我有这个错误:sed -i -e '/if/! s/\(end.*)\;//' test sed: -e expression #1, char 20: Unmatched ( or \(

对我来说,我似乎有一个右括号,不太确定 '\' 。我以前只做过一次,所以很新鲜。

答案1

  1. 您的第一次尝试错过了语法replacement部分s/pattern/replacement/modifiers

  2. 您忘记转义右括号:使用\).

  3. 但无需转义分号。

  4. 您的模式包括所有end.*;.所以所有这些都将被删除。用作\1;替代品。

总共:

sed -i -e '/if/!s/\(end\).*;/\1;/' file

或者作为end静态词并且 .* 包含;您可以简化它:

sed -i -e '/if/!s/end.*/end;/' file

相关内容