我有一个按以下方式构造的字符串
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
修改行中的最后一个,XX
因为这.*
是贪婪的。
如果你XX
是[1;34m
并且YY
是[1;90m
,那么
sed 's/\[1;34m/[1;90m/g; s/\(.*\)\[1;90m/\1[1;34m/'
请注意,[
必须对它进行转义,就像\[
您想在正则表达式中匹配它一样。
答案2
使用 GNUsed
和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
为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
正如我的一位同事所说,条条大路通罗马,有些路比其他路快。