40

次のような行があります。

sed -i 's/mystring/newstring/' $target

このコマンドは、すべてmystringをに変更しnewstringます。

私が今欲しいのは、プログラムが を見たときmystring、文字列searchstringが存在するかどうか、現在の行を確認するにはどうすればよいですか? 存在する場合newstring1; そうでなければ、newstringです0

4

2 に答える 2

68

解決

入力ファイル $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 に感謝します。

于 2012-08-14T18:32:30.143 に答える
18

これは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
于 2012-08-14T18:34:10.773 に答える