次のように構成された文字列があります。
XXthisXXisXXjust\nXXa\nXXtest
XX
各文字の前の最後の文字を次のように変更したいと思います。\n
YY
$ echo "XXthisXXisXXjust\nXXa\nXXtest"
XXthisXXisXXjust
XXa
XXtest
しなければならない
$ echo "XXthisXXisXXjust\nXXa\nXXtest" | ???
YYthisYYisXXjust
XXa
XXtest
どうすればいいですか?
編集:私の元の質問は少しXYの問題、その点はお詫び申し上げます。私の場合はカラーコードを修正する必要があるので、XX
実際には太い青のコード[1;34m
とYY
太い灰色のコードになりました[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
YY
2番目の交換は、変更された行の最後の置換を置き換えます。XX
これは.*
欲が多いからです。
もしそうXX
なら[1;34m
、YY
そうであれば[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
- まず、すべてのインスタンスを変更し
XX
ますYY
。
s/XX/YY/g
- 次に、次から始まる
\nYY
すべての項目を置き換えます。\nXX
s/\\nYY/\nXX/g
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
私の同僚の一人が言ったように、すべての道はローマであり、ある道は他の道よりも速いです。