2017-04-17 229 views
0

創建搜索和替換功能爲我的申請,我運行一個測試場景,其中3個文件, 陣列 tscript 測試轉義雙引號在sed

我試圖逃脫雙引號,但它不會工作

腳本文件包含

variableName=$1 
sed "s#data\-field\=\"${variableName}\.name\"#data\-field\=${variableName}\.name data\-type\=dropdown data\-dropdown\-type\=${variableName}#g" test 

測試文件包含

data-field=「fee_category.name」 
data-field=「tax_type.name」 

陣列文件包含

fee_category 
tax_type 

沒有錯誤代碼,輸出正是我所輸入的,因爲sed命令找不到它正在尋找的,如果我不使用雙引號旁邊$ {VariableName}並將它們從測試文件中移除,該函數可以正常工作。

+4

您的示例輸入包含[非ASCII雙引號](http://www.fileformat.info/info/unicode/char/201c/index.htm),其中ASCII''''我的'sed'命令獲得't'匹配 – mklement0

+0

你想搜索一個文字字符串還是一個正則表達式?如果它是一個正則表達式,你希望捕獲組是否被啓用?是否需要反向引用元字符(例如'&'或'\ 1') –

+0

我正在尋找文字字符串和使用正則表達式替換它 –

回答

0

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風格中不起作用。

0

在有疑問的情況下,你可以嘗試通配符他們:

variableName="fee_category" 
sed "s#data-field=.${variableName}\.name.#& data-type=dropdown data-dropdown-type=${variableName}#g" test 

# Or, when you do not want those quotes back in your output 
sed "s#\(data-field=\).\(${variableName}\)\(\.name\).#\1\2\3 data-type=dropdown data-dropdown-type=\2#g" test