
次のファイルがあります
> cat tmp
"aaa"
"aaa:xyz"
希望の出力は
"bbb"
"aaa:xyz"
次のsedコマンドを使用しています
sed "s/\baaa\b/bbb/" tmp
しかし、このコマンドを使用すると
"bbb"
"bbb:xyz"
コロン文字は単語の境界として扱われるようです。最初の行だけを変更し、2番目の行を変更せずに目的の出力を取得するにはどうすればよいですか?私は以下を試しましたが、うまくいきませんでした
sed "s/\Baaa\B/bbb/" tmp
sed "s/\baaa\B/bbb/" tmp
sed "s/\Baaa\b/bbb/" tmp
編集:以下のように、同じファイルに対して別のsedコマンドを使用する必要がありました。
's/aaa:xyz/ttt/' tmp
したがって、コロンがない場合にのみ置換を実行できます。行にコロンがあるかどうかにかかわらず、交換を実行できる必要があります。
答え1
GNU\b
幅0の単語境界モードは、単語文字と単語以外の文字を一致させます。 「単語文字」は通常、英数字と下線(_
)です。これは\b
文字列と 。の間に一致があることを意味します。aaa
:
aaa:
以下は、\b
すべての一致を次に置き換えて、サンプル文書で一致が発生する場所を示しています。\b
*
$ sed 's/\b/*/g' file
"*aaa*"
"*aaa*:*xyz*"
すべてのインスタンスを"aaa"
次に置き換える"bbb"
には
$ sed 's/"aaa"/"bbb"/g' file
"bbb"
"aaa:xyz"
すべてを変える性格 aaa
bbb
コロンを含まないすべての行に使用してください。
$ sed '/:/!s/\baaa\b/bbb/g' file
"bbb"
"aaa:xyz"
aaa
後にコロンが来ない単語を次に置き換えるにはbbb
:
$ sed -e 's/\baaa\([^:]\)/bbb\1/g' -e 's/\baaa$/bbb/' file
"bbb"
"aaa:xyz"
ここで最初の代替に注意してください。必要aaa
部分文字列を表します。はい次は別のキャラクターが出てきます。これはaaa
、行末の部分文字列が置き換えられないことを意味します。これが、このケースに別々の交換品を用意した理由です。
答え2
一致しない場合は、:
aaa を bbb に置き換えます。
sed '/:/! s/aaa/bbb/g' test.txt
パールの使用:
perl -pe 'if(!/:/){s/aaa/bbb/}' tmp
答え3
sedを使用してください:
sed 's/"aaa"/"bbb"/' file
出力:
「bb」 「あああ:xyz」