Shell

在 sed 替換字元串中轉義 ’ (單引號)

  • September 18, 2020

我有一個腳本,用於跨伺服器執行一些 iptables 更改。在腳本中,我有一個 sed 命令來查找字元串並在該行之前插入 iptables 規則。

我遇到的問題是我正在編輯的文件是一個 yaml 文件,我需要在該行中有一個 ’ 和 ’ 。

如果我從我插入的內容中刪除 ’ ,它會起作用。

$ sed 's/.*output_snat_lo.conf:.*/- -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1\n&/' file.yaml


    - '-t nat -A POSTROUTING -s 192.168.1.25/32 -d 10.0.0.1 -j SNAT --to-source 172.1.1.1'
    - -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1
 output_snat_lo.conf:

但是,如果我嘗試用斜杠轉義它或將它放在雙引號內,用斜杠雙引號我無法列印 ’ 而是提供發送無效標誌選項。

這就是我要插入的內容。

- '-t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1'\n&/' file.yaml

有什麼建議/技巧嗎?我覺得我過去曾這樣做過,但不記得是如何做到的。

關閉要放入正則表達式的單引號,轉義單引號,然後再次打開它

$ echo "a'b" | sed 's/'\''/X/'
aXb

$ echo "aXb" | sed 's/X/'\''/'
a'b

你不需要在sed中轉義,這裡'沒有特殊意義。您需要在 bash 中對其進行轉義。

$ sed -e "s/'/singlequote/g" <<<"'"
singlequote

您可以在這裡看到雙引號保護單引號免受 bash 的影響,而 sed 可以很好地處理它。這是切換單引號時發生的情況。

$ sed -e 's/'/singlequote/g' <<<"'"
>

'在 bourne like shells (all?) 中的奇怪之處在於,它的功能"更像是一個標誌,以禁用其他字元解釋,直到'看到另一個字元。如果你用雙引號將它括起來,它就沒有特殊意義。觀察:

$ echo 'isn'"'"'t this hard?'
isn't this hard?

您也可以使用反斜杠對其進行轉義,如另一個答案所示。但是你必須先離開單引號塊,然後才能工作。因此,雖然這似乎可行:

echo '\''

它不是; 第一個禁用字元'的含義。\

我建議你採取不同的方法。sed表達式可以指定為命令行參數 - 但代價是必須從 shell 中轉義。逃避一個簡短的 sed 表達式還不錯,但是你的很長並且有很多特殊字元。

我會將您的sed命令放在一個文件中,並使用參數呼叫sed-f指定命令文件,而不是在命令行中指定它。http://man7.org/linux/man-pages/man1/sed.1.html或者man sed會詳細介紹。這樣,sed命令就不是 shell 所看到的內容的一部分(它只看到文件名),並且 shell 轉義難題消失了。

$ cat t.sed
s/'*/singlequote(s)/g

$ sed -f t.sed <<<"' ' '''"
singlequote(s) singlequote(s) singlequote(s)

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