仅当字符不在大括号内时才替换它(sed、awk、tr、...)

仅当字符不在大括号内时才替换它(sed、awk、tr、...)

我有一个名为“desktops”的字符串,如下所示:

desktops="1 2 %{F#990000}3%{F-} 4 5 6 7 8 9 0"

“#”后面的 6 位数字代表 RGB 颜色,因此第 3 个桌面的颜色为深红色。上述以空格分隔的数字之一可以代表聚焦桌面,例如:

focused="9"

在这种情况下,我需要这样的输出:

"1 2 %{F#990000}3%{F-} 4 5 6 7 8 %{F#FFFF00}9%{F-} 0"

当 RGB 颜色代码中的数字也出现在桌面列表中时,就会出现问题。

我试过这个:

echo $desktops | sed "s/$focused/%{F#FFFF00}$focused%{F-}/"

但是,当颜色代码的焦点变量中存在数字时,它当然不起作用。

有什么提示吗?

答案1

与周围空间相匹配。暂时添加边界空格,以便您可以匹配序列中的第一个或最后一个桌面数字,然后将其删除。

echo " $desktops " | sed -e "s/ $focused / %{F#FFFF00}$focused%{F-} /" -e 's/^ \(.*\) $/\1/'

使用 GNU 扩展或类似的扩展,您可以直接在单词边界上进行匹配:

    echo "$desktops" | sed -e "s/\<$focused\>/%{F#FFFF00}$focused%{F-}/"

相关内容