在sed中转义双引号

时间:2017-04-17 20:07:33

标签: regex bash shell sed

为我的应用程序创建搜索和替换功能,我正在运行一个包含3个文件的测试场景, 排列 tscript 测试

我试图逃避双引号,但它无法正常工作

脚本文件包含

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}旁边的双引号并将其从测试文件中删除该函数工作正常。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

mklement0的评论之后,我只是写这个答案,以便分享我的一些发现,以防我们需要你的特殊双引号的字面匹配。它可能对其他用户有用。

您的引文fee_category.name左侧有Unicode Left Double Quotation Mark U+201c引号,右侧有Unicode Right Double Quotation Mark U+201d

那些非标准引号在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)

使用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代码或使用utf-8十六进制系列在bash中打印这些unicode字符:

$ 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 **

此外,这似乎工作正常,无需使用&#34; helper&#34;变量:

$ 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 Testing&amp; Bash 4.4&amp; GNU Sed 4.4可能是这种技术不适用于其他sed风格。