Regex

sed 中的正則表達式:匹配前面或後面沒有特定其他字元的字元

  • August 6, 2016

假設使用分號作為欄位終止符的格式錯誤的 csv 片段:

abc;d" "e"f;"ijk"

根據RFC4180,欄位內的 dquote 應由兩個 dquote 表示:

abc;d"" ""e""f;"ijk"

我試圖通過一個sed腳本來實現這一點,該腳本匹配任何前面沒有或後面沒有欄位終止符的 dquote(here ;):

echo 'abc;d" "e"f;"ijk"' | sed -e 's/\([^;]\)"\([^;]\)/\1""\2/g'

結果幾乎是好的:

abc;d"" "e""f;"ijk"

除了之前的雙引號e不匹配,因此不重複。

誰能解釋我為什麼這不起作用,因為之前和之後e沒有分號。

您的第二個報價不匹配,因為匹配將是space quote e,並且space已經被前面的 消耗了d quote space

這是環視匹配的教科書範例,它匹配但不消耗。不幸的是,環視匹配沒有在sed. 如果我不得不使用sed這個,我會首先用一些非出現的字元替換有效的引號,然後將所有剩餘的引號加倍,然後放回有效的引號。

Perl 有環視匹配,這在眼睛上(有點)容易:

$ echo 'abc;d" "e"f;"ijk"' | perl -pe 's/(?<!;)"(?![;\n])/""/'g
abc;d"" ""e""f;"ijk"

翻譯:前面沒有 regex 的引號;,後面沒有 regex [;\n]

\n 在那裡是因為 perl 認為它是行的一部分,因此除非我們禁止它,否則它將匹配最後一個引號。

引用自:https://serverfault.com/questions/795224