最後のインスタンスを除く文字列のすべてのインスタンスを置き換える

最後のインスタンスを除く文字列のすべてのインスタンスを置き換える

次のように構成された文字列があります。

XXthisXXisXXjust\nXXa\nXXtest

XX各文字の前の最後の文字を次のように変更したいと思います。\nYY

$ echo "XXthisXXisXXjust\nXXa\nXXtest"
XXthisXXisXXjust
XXa
XXtest

しなければならない

$ echo "XXthisXXisXXjust\nXXa\nXXtest" | ???
YYthisYYisXXjust
XXa
XXtest

どうすればいいですか?

編集:私の元の質問は少しXYの問題、その点はお詫び申し上げます。私の場合はカラーコードを修正する必要があるので、XX実際には太い青のコード[1;34mYY太い灰色のコードになりました[1;90m

[1;34mただし、同じ行(最後の行を含む)に3つ以上のインスタンスを持つことができます。

もう一度時間を無駄にしたら謝ります。この回避策は私の状況に簡単に適用できるようです。

答え1

使用標準sed:

$ printf 'XXthisXXisXXjust\nXXa\nXXtest\n' | sed 's/XX/YY/g; s/\(.*\)YY/\1XX/'
YYthisYYisXXjust
XXa
XXtest

コードsedコメント:

s/XX/YY/g;              # change all XX to YY
s/\(.*\)YY/\1XX/;       # replace last YY with XX

YY2番目の交換は、変更された行の最後の置換を置き換えます。XXこれは.*欲が多いからです。

もしそうXXなら[1;34mYYそうであれば[1;90m

sed 's/\[1;34m/[1;90m/g; s/\(.*\)\[1;90m/\1[1;34m/'

正規表現で一致させるようにエスケープする[必要があります。\[

答え2

GNUを使用しsedて、次の操作を行いますrev

$ echo "XXthisXXisXXjust\nXXa\nXXtest" | rev | sed 's/XX/YY/2g' | rev
YYthisYYisYYjust\nYYa\nXXtest

$ echo -e "XXthisXXisXXjust\nXXa\nXXtest" | rev | sed 's/XX/YY/2g' | rev
YYthisYYisXXjust
XXa
XXtest

検索を逆にして文字列を置き換える必要はありません。つまり、この特別な場合XXにはYY回門だからです。

答え3

  1. まず、すべてのインスタンスを変更しXXますYY

s/XX/YY/g

  1. 次に、次から始まる\nYYすべての項目を置き換えます。\nXX

s/\\nYY/\nXX/g

  1. YY最後に、3番目のイベントを次に置き換えました。XX

s/YY/XX/3

[root@ServerA studyroom]# echo "XXthisXXisXXjust\nXXa\nXXtest" | sed 's/XX/YY/g;s/\\nYY/\nXX/g;s/YY/XX/3'
YYthisYYisXXjust
XXa
XXtest

私の同僚の一人が言ったように、すべての道はローマであり、ある道は他の道よりも速いです。

関連情報