Shell

sed sh 轉義問題

  • July 2, 2020

我非常接近我的目標,但我被困在這一點上。

我正在嘗試創建一個對phpmyadmin配置文件進行一些簡單編輯的自動化腳本。

cat /usr/share/phpmyadmin/config.sample.inc.php |sed s^//\ \$cfg\\[\'Servers\'^\$cfg\\[\'Servers\'^

基本上我試圖刪除// 所有以// $cfg['Servers']. 上面的行確實做到了,但我對我必須做的所有轉義感到不滿。我已經嘗試了這個 sed 命令的數百種變體,但是轉義所有其他字元似乎是迄今為止唯一有效的方法。

另一個障礙是:最終我想通過提升的外殼(使用sudo sh -c)傳遞上述命令字元串,例如:

sudo sh -c "cat /usr/share/phpmyadmin/config.sample.inc.php |sed s^//\ \$cfg\\[\'Servers\'^\$cfg\\[\'Servers\'^  >/usr/share/phpmyadmin/config.inc.php"

但每次我嘗試這樣做時,我都會收到此錯誤:

sed: -e expression #1, char 27: unterminated `s' command

所以我的問題是:我可以簡化我的sed表達式,這樣我就不需要轉義這麼多字元,以及如何將它傳遞給一個提升的 shell,這樣它就不會破壞我的sed s命令?

我認為我的主要問題是提升的外殼傳遞了一個由雙引號分隔的字元串,而 sed 字元串包含單引號。在過去,我通常沒有同時使用這兩種命令的命令,所以我可以用一個代替另一個。

如果腳本正確地包含在雙引號中,則無需轉義空格和單引號:

sed "s^// \$cfg\['Servers'^\$cfg['Servers'^" file

此外,替換中的括號不需要轉義。正則表達式中的括號確實需要轉義,否則它會被理解為特殊的正則表達式符號。

為了最大程度地減少轉義,最好將 sed 命令放在一個文件中,這樣我們就不需要雙引號,也不需要保護$替換中的美元符號免受 shell 擴展。

servers.sed:

s^// \$cfg\['Servers'^$cfg['Servers'^

然後以這種方式執行它:

sed -f servers.sed file

最後一種形式在提升的 shell 中也很容易使用:

sudo sh -c 'sed -f servers.sed file > newfile'

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