次のような行があります。
sed -i 's/mystring/newstring/' $target
このコマンドは、すべてmystring
をに変更しnewstring
ます。
私が今欲しいのは、プログラムが を見たときmystring
、文字列searchstring
が存在するかどうか、現在の行を確認するにはどうすればよいですか? 存在する場合newstring
は1
; そうでなければ、newstring
です0
。
入力ファイル $target には次のものが含まれていると仮定します。
some text mystring some other text
some text mystring a searchstring
just some more text
このコマンド:
sed -i -e '/searchstring/ s/mystring/1/ ; /searchstring/! s/mystring/0/' $target
その内容を次のように変更します。
some text 0 some other text
some text 1 a searchstring
just some more text
スクリプトには、セミコロンで区切られた2 つの代替 ( s ) コマンドが含まれています。
置換コマンドは、置換を行う行を選択するオプションのアドレス範囲を受け入れます。
この場合、正規表現アドレスは、最初のコマンドの検索文字列を含む行を選択するために使用されました。2番目の検索文字列を含まない行(一致を否定する正規表現の後の感嘆符に注意してください)。
このコマンドはパフォーマンスが向上し、まったく同じ結果が得られます。
sed -i -e '/searchstring/ s/mystring/1/ ; s/mystring/0/' $target
ポイントは、コマンドが順番に実行されるため、最初のコマンドが終了した後も現在の行にまだmystring部分文字列がある場合、その中に確実に検索文字列がないことです。
user946850 に感謝します。
これはsed ワンライナーページからのものです。
速度の最適化: 実行速度を上げる必要がある場合 (入力ファイルが大きい、プロセッサやハードディスクが遅いなどの理由で)、「s/.../. ../" 命令。したがって:
sed 's/foo/bar/g' filename # standard replace command sed '/foo/ s/foo/bar/g' filename # executes more quickly sed '/foo/ s//bar/g' filename # shorthand sed syntax
速度は当面の問題ではありませんが、構文のヒントは解決策を策定するのに役立ちます。
sed -i '/searchstring/ s/mystring/1/; s/mystring/0/' $target