文字列の終わりと文字;間にある文字列を削除しようとすると問題が発生します。現在はendと;間にあるので、他の行でも文字列を選択するようです。コマンドからif文字列を省略しようとしましたが、エラーが発生した場合は、以下のsedコマンドをあまり使用しないようです。文字列トリガー名は削除する必要がある名前ですが、一貫して名前が付けられていません。
前のサンプルファイル:
end if;
end triggername ;
予想されるサンプルファイル:
end if;
end;
私が使用しようとしたコマンドは次のとおりです。
sed -i -e '/if/! s/\(end.*)\;/g' test
/もし/してください!次のコマンドのすべてのリテラル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