繼mklement0的評論,我只是在寫這個答案,以分享我的一些研究結果的情況下,我們需要一個文字匹配你特殊的雙引號。它可能對其他用戶有用。
您的報價文本fee_category.name
在左側有Unicode Left Double Quotation Mark U+201c的報價,在右側有Unicode Right Double Quotation Mark U+201d的報價。
那些非STD引號也有UTF-8一定的代表性:
Unicode Left Double Quotation Mark U+201c
UTF-8(十六進制)0xE2 0x80的爲0x9c(e2809c)
UTF-16(十六進制)0x201C(201C)
Unicode Right Double Quotation Mark U+201d
UTF-8(十六進制)0xE2 0x80的0x9D(e2809d)
UTF-16(十六進制)0x201D(201D)
Analyzin摹與od
實用的文件中,我們可以確認上述六角UTF-8序列的存在在你的數據:
$ echo data-field=「fee_category.name」 |od -w40 -t x1c
0000000 64 61 74 61 2d 66 69 65 6c 64 3d e2 80 9c 66 65 65 5f 63 61 74 65 67 6f 72 79 2e 6e 61 6d 65 e2 80 9d 0a
d a t a - f i e l d = 342 200 234 f e e _ c a t e g o r y . n a m e 342 200 235 \n
有趣的是,我們可以通過使用他們的Unicode代碼或使用打印在bash的Unicode字符在UTF-8十六進制系列:
$ echo -e "\u201c test \u201d"
「 test 」
$ echo -e "\xe2\x80\x9c test \xe2\x80\x9d"
「 test 」
因此,我們可以強制sed來匹配這些特殊字符是這樣的:
$ string=$(echo -e "\u201c test \u201d");echo "$string"
「 test 」
$ lq=$(echo -ne "\u201c");rq=$(echo -ne "\u201d")
$ sed -E "s/($lq)(.+)($rq)/**\2**/" <<<"$string"
** test **
而且這似乎工作˚F國家統計局,而不需要使用「幫手」變量:
$ sed -E "s/(\xe2\x80\x9c)(.+)(\xe2\x80\x9d)/**\2**/" <<<"$string"
** test **
含義是十六進制序列\xe2\x80\x9c
(或\xe2\x80\x9d
右引號)可以通過sed
直接用來提供在這個特殊的報價字面匹配。
你還不如讓你的文件的前處理和轉換所有的非標準引號使用類似標準的報價:
$ sed -E "s/[\xe2\x80\x9c,\xe2\x80\x9d]/\x22/g" <<<"$string"
" test " #Special quotes replaced with classic ascii quotes.
上面的測試已經在Debian的測試&猛砸4.4 & GNU已經完成Sed 4.4並且可能是這種技術在其他sed風格中不起作用。
您的示例輸入包含[非ASCII雙引號](http://www.fileformat.info/info/unicode/char/201c/index.htm),其中ASCII''''我的'sed'命令獲得't'匹配 – mklement0
你想搜索一個文字字符串還是一個正則表達式?如果它是一個正則表達式,你希望捕獲組是否被啓用?是否需要反向引用元字符(例如'&'或'\ 1') –
我正在尋找文字字符串和使用正則表達式替換它 –