当尝试删除字符串末尾和字符 ; 之间的字符串时,我遇到了一些麻烦。目前看来我也在其他行上拾取该字符串,因为该字符串也在 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
您的第一次尝试错过了语法
replacement
部分s/pattern/replacement/modifiers
。您忘记转义右括号:使用
\)
.但无需转义分号。
您的模式包括所有
end.*;
.所以所有这些都将被删除。用作\1;
替代品。
总共:
sed -i -e '/if/!s/\(end\).*;/\1;/' file
或者作为end
静态词并且 .* 包含;
您可以简化它:
sed -i -e '/if/!s/end.*/end;/' file