Shell

僅當字元不在大括號內時才替換字元(sed、awk、tr、…)

  • May 2, 2022

我有一個名為“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-}/"

但是當顏色程式碼在焦點變數中存在數字時,它當然不起作用。

有什麼提示嗎?

匹配周圍的空間。臨時添加邊界空間,以便您可以匹配序列中的第一個或最後一個桌面數字,然後將其刪除。

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

使用 GNU 擴展或類似擴展,您可以直接在單詞邊界上進行匹配:

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

引用自:https://unix.stackexchange.com/questions/701108