Sed

轉義未轉義的正斜杠

  • August 12, 2022

我有包含轉義和未轉義的正斜杠的字元串。

我正在尋找一個 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"

如果文本行儲存在bashshell 中的字元串中,您可以在那裡執行類似的操作:

$ 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}變數替換,它將patternin的所有匹配$variable替換為replacement

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