複数行をsedに置き換えるには、スクリプトファイル(sed -f)を使用してください。

複数行をsedに置き換えるには、スクリプトファイル(sed -f)を使用してください。

見つけた素晴らしい答えに基づいてここsed、使用するスクリプトファイルでこれらのコマンドのいくつかを試してみましたsed -f。ファイルに複数のsedコマンドがあり、問題なく実行され続けます。これで、ファイルの末尾に次の2行を追加する必要があります。

/^$/{N;s/^$\nbegin of this/begin/g}
/^$/{N;s/^$\nend of this/end/g}

デフォルトでは、空行(^$)の後にbegin of thisorフレーズが続くことを検索したend of this後、空行を削除してbegin次の行をorに置き換えますend

各コマンドは問題なく独立して実行されますが、スクリプトファイルに配置すると問題が発生します。前のコマンドの一部が動作を停止しました(例:s/\\ \\ //g文字列の削除\ \)。さらに重要なことは、最初の2行のコマンドのうち最初のコマンドのみが実行されることです。なぜですか?いくつかのコマンドラインスイッチがありませんかsed?同じスクリプトファイルに複数行のコマンドを使用できますか?

追加の「ポイント」として、2つの正規表現行をキャプチャグループに置き換えたいという誘惑を受けましたが、それも/^$/{N;s/^$\n(begin|end) of this/\1/g}機能せず、コマンドラインから直接実行することもできません。

perl私はORを使用しないので、比較的シンプルで実行可能な解決策があることを願っています。awkしかし、これが独自の制限であるsed場合、または実装するのが非常に複雑な場合(非常に間違いなく)、代替策を使用します。

以下は非常に基本的なサンプルテキストです。

some text

begin of this
some more text

end of this

A sentence

Another sentence 

結果は次のとおりです。

some text
begin
some more text
end

A sentence 

Another sentence 

答え1

@seshoumaraがこの問題を解決したと思います。そうですか?とにかく私はこれを考えました。

sed  -r '/^$/{N; s/\n(begin|end) of this/\1/g}' file

関連情報