我的文件中有以下字符串:
"sequence A$_{0}$B$_{}$C$_{'0}$"
我想移动$_{
之后出现的任何单引号,即
"sequence A$_{0}$B$_{}$C'$_{0}$"
这是我的sed命令(使用#
作为分隔符)仅包含引号的部分:
$ echo "$_{'0}$" | sed "s#$_{'#'\$_{#g"
'$_{0}$
所以这很有效。但是,我的文字包含不应匹配的字符串,例如
$ echo "$_{0}$" | sed "s#$_{'#'\$_{#g"
/home/ppatest/texlive/2010/texmf{0}$`
我知道$_
给出了上一个命令的最后一个参数。我查了一下:
$ echo $_
/home/ppatest/texlive/2010/texmf
但我不明白为什么$_{'
匹配"$_{0}$"
此外,我发现为了防止Unix shell将美元符号解释为shell变量,脚本应该放在单引号中。但我不能这样做,因为我也在单引号上匹配。
答案 0 :(得分:2)
您当前的方法使用sed
中的双引号来处理单引号。但是,正如您所看到的,这会产生$
的扩展,因此您最终可能会遇到更广泛的问题。
我建议使用带单引号的sed
表达式。要匹配和替换单引号,您需要关闭前导'
,将'
括在"
中,然后再次打开表达式:
$ echo "he'llo" | sed 's#'"'"'#X#'
heXllo
在你的情况下:
sed 's#$_{'"'"'#'"'"'$_{#g' file
这样,您继续使用单引号并阻止$
扩展。
$ cat a
hello $_{'0}$ bye
$_{'0}$
yeah
$ sed 's#$_{'"'"'#'"'"'$_{#g' a
hello '$_{0}$ bye
'$_{0}$
yeah
答案 1 :(得分:0)
echo "\$_{'0}\$" | sed "s#\(\$_{\)'#'\1#g"
$
\$