sedを使用して改行文字を含む文字列を削除します。

sedを使用して改行文字を含む文字列を削除します。

sedを使用してファイルから特定の文字列を削除したいと思います。

sed -i 's/mystringtodelete //g'

ただし、この方法は、文字列に任意の改行文字がある場合は機能しません。たとえば、次のようになります。

私のもの

映画

ゲトデル

など

誰もが解決策を知っていますか?

ベストアンサー1

s コマンドの正規表現では、文字列の各改行文字を\n次のように変換する必要があります。

s/my\n\nstrin\n\ngtodel\n\nete\n//g

\n実際にパターンの一部であるかどうかにかかわらず、最後の項目に特別な注意を払ってください。

その後、このツールはsed行ベースのツールなので、基本的にすべての入力にコマンドを適用することに注意してください。ワイヤー順番に、入力に表示されるすべての改行文字(改行文字)は「入力行」として機能します。

したがって、改行文字を含むパターンを一致させる必要がある場合は、それを明示的に表示する必要がありますsed

代替方法は、-zNUL文字(バイナリ0x00)を行区切り文字として使用するオプションを使用することです。ただし、入力データが次の場合はこれを行うことはできません。返品NULを含みます。

あなたの入力いいえNULが含まれていてsed 実際にこのオプションがある場合は、上記のコマンドを-z使用してすべての設定を完了します。ssed -z

すべての入力を処理するための代替方法は、デフォルトでsed 「予約済みスペース」に行を追加してから、そのメモリ領域にパターンを適用することです。

一部の実装では、スペースを予約するためのスペースが制限されているため、アドレスを使用して代替が適用される入力を絞り込むことができれば、より良いことがありますsedsedそれ以外の場合は、入力全体を読み、それが地域に合うようにする必要があります。しかし、例えばGNUにはsed制限がないため、通常のLinuxシステムを使用している場合は問題ありません。

入力範囲を絞り込むことができないと仮定すると(つまり、文字列が入力の任意の場所に表示される場合があります)、sed適切なコマンドは次のとおりです。

cat input_file | sed -ne '1h;1!H;${x;s/my\n\nstrin\n\ngtodel\n\nete\n//g;p}'

細分化されたsedコマンドは次のとおりです。

1h;     # *copy* first line to hold-space
1!H;    # *append* all non-first lines (i.e. all lines after the first) to hold-space
${x;    # at the end of input move hold-space into regular pattern-space
  s/my\n\nstrin\n\ngtodel\n\nete\n//g;  # then apply substitution
  p}    # and print the resulting text

おすすめ記事