間のすべてを一致コメント:次へ;または行末そしてそれを言葉に変えてください。バー
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:
。交換用スロットに入れます。 \w
GNU拡張質問で主張するように、「すべてが次に移動します」(\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