sed を使用して単語、文字、または行末の一致を置き換えます。

sed を使用して単語、文字、または行末の一致を置き換えます。

間のすべてを一致コメント:次へ;または行末そしてそれを言葉に変えてください。バー

s="/home/user/14.JPG;comment:foo;sometag;sort:30"
sed "s/comment:(\w+)/\bar/g" <<< $s

商品を返す

/home/user/14.JPG;comment:foo;sometag;sort:30

変える

/home/user/14.JPG;comment:bar;sometag;sort:30

私は何が間違っていましたか?

答え1

まず、拡張正規表現(ERE)を使用しようとしますが、Sedはデフォルトでデフォルト正規表現(BRE)を使用します。つまり、()グループ化と+「1つ以上」の場合はEREです。詳しくはお読みください。私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?。 EREを有効にするには、この-Eフラグを使用します(ただし、私たちのソリューションでは必要ありません)。

comment:(\w+)お似合いだからそれだけでは足りないけど

  • 再紹介する必要はありませんcomment:。交換用スロットに入れます。
  • \wGNU拡張質問で主張するように、「すべてが次に移動します」(\w+)ではなく単語文字を一致させます。;[^;]*

解決策は

sed 's/comment:[^;]*/comment:bar/g'

答え2

グループを使用して麻痺を通じて通話できます。グループ化して yyy を xxx に置き換えます。

$ echo "foo yyy bar" | sed 's/\(foo\).*\( bar\)/\1 xxx \2/'  
foo xxx bar

あなたの場合:

sed "s/\(comment:\).*\(sometag\)/\1bar\2/g" <<< $s

関連情報