在 sed 替換字元串中轉義 ’ (單引號)
我有一個腳本,用於跨伺服器執行一些 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)