转义双引号在sed
创建搜索和替换功能为我的申请,我运行一个测试场景,其中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}并将它们从测试文件中移除,该函数可以正常工作。
继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风格中不起作用。
在有疑问的情况下,你可以尝试通配符他们:
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
您的示例输入包含[非ASCII双引号](http://www.fileformat.info/info/unicode/char/201c/index.htm),其中ASCII''''我的'sed'命令获得't'匹配 – mklement0
你想搜索一个文字字符串还是一个正则表达式?如果它是一个正则表达式,你希望捕获组是否被启用?是否需要反向引用元字符(例如'&'或'\ 1') –
我正在寻找文字字符串和使用正则表达式替换它 –