Regex
sed 中的正則表達式:匹配前面或後面沒有特定其他字元的字元
假設使用分號作為欄位終止符的格式錯誤的 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 認為它是行的一部分,因此除非我們禁止它,否則它將匹配最後一個引號。