Sed
轉義未轉義的正斜杠
我有包含轉義和未轉義的正斜杠的字元串。
我正在尋找一個 sed 替換來僅轉義未轉義的斜杠,但似乎不支持負面的lookbehinds。
例子:
input: "https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https://baz/test.com" desired output: "https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https:\/\/baz\/test.com"
sed
預設情況下使用POSIX 基本正則表達式,它不包括通常在 Perl 兼容的正則表達式語言中發現的前瞻和其他零寬度斷言。相反,只需取消轉義轉義的斜杠,然後轉義修改後的字元串中的所有斜杠:
sed -e 's@\\/@/@g' -e 's@/@\\/@g'
這首先將所有實例更改為
\/
into/
,然後將所有實例更改/
為\/
。@
是替代命令的替代分隔符,以避免傾斜牙籤綜合症(您幾乎可以使用任何其他字元)。例子:
$ echo '"https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https://baz/test.com"' | sed -e 's@\\/@/@g' -e 's@/@\\/@g' "https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https:\/\/baz\/test.com"
如果文本行儲存在
bash
shell 中的字元串中,您可以在那裡執行類似的操作:$ string='"https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https://baz/test.com"' $ string=${string//\\\///} # leaning toothpick warning! $ string=${string//\//\\/} $ printf '%s\n' "$string" "https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https:\/\/baz\/test.com"
上面使用了
${variable//pattern/replacement}
變數替換,它將pattern
in的所有匹配$variable
替換為replacement
。