替换字符串中除最后一个之外的所有实例

替换字符串中除最后一个之外的所有实例

我有一个按以下方式构造的字符串

XXthisXXisXXjust\nXXa\nXXtest

我想将每个字符XX之前的最后一个更改为,因此以下内容\nYY

$ 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修改行中的最后一个,XX因为这.*是贪婪的。

如果你XX[1;34m并且YY[1;90m,那么

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

请注意,[必须对它进行转义,就像\[您想在正则表达式中匹配它一样。

答案2

使用 GNUsedrev

$ 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

无需反转搜索和替换字符串,即XXYY这种特殊情况下,因为它们是回文。

答案3

  1. 我首先更改 的所有实例XX并将其替换为YY

s/XX/YY/g

  1. 然后我替换以以下开头的任何\nYY内容\nXX

s/\\nYY/\nXX/g

  1. 我终于将第三次出现的替换YYXX

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

正如我的一位同事所说,条条大路通罗马,有些路比其他路快。

相关内容