sedを使用してファイルから特定の文字列を削除したいと思います。
sed -i 's/mystringtodelete //g'
ただし、この方法は、文字列に任意の改行文字がある場合は機能しません。たとえば、次のようになります。
私のもの
映画
ゲトデル
など
誰もが解決策を知っていますか?
答え1
s
コマンドの正規表現では、文字列の各改行文字を\n
次のように変換する必要があります。
s/my\n\nstrin\n\ngtodel\n\nete\n//g
\n
実際にパターンの一部であるかどうかにかかわらず、最後の項目に特別な注意を払ってください。
その後、このツールはsed
行ベースのツールなので、基本的にすべての入力にコマンドを適用することに注意してください。ワイヤー順番に、入力に表示されるすべての改行文字(改行文字)は「入力行」として機能します。
したがって、改行文字を含むパターンを一致させる必要がある場合は、それを明示的に表示する必要がありますsed
。
代替方法は、-z
NUL文字(バイナリ0x00)を行区切り文字として使用するオプションを使用することです。ただし、入力データが次の場合はこれを行うことはできません。返品NULを含みます。
あなたの入力いいえNULが含まれていてsed
実際にこのオプションがある場合は、上記のコマンドを-z
使用してすべての設定を完了します。s
sed -z
すべての入力を処理するための代替方法は、デフォルトでsed
「予約済みスペース」に行を追加してから、そのメモリ領域にパターンを適用することです。
一部の実装では、スペースを予約するためのスペースが制限されているため、アドレスを使用して代替が適用される入力を絞り込むことができれば、より良いことがありますsed
。sed
それ以外の場合は、入力全体を読み、それが地域に合うようにする必要があります。しかし、例えば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