为我的应用程序创建搜索和替换功能,我正在运行一个包含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}旁边的双引号并将其从测试文件中删除该函数工作正常。
答案 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风格。