if - sedの場合は、文字列を省略しながら2つの文字列の間の文字列を削除してみてください。

if - sedの場合は、文字列を省略しながら2つの文字列の間の文字列を削除してみてください。

文字列の終わりと文字;間にある文字列を削除しようとすると問題が発生します。現在は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

  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

関連情報