sed匹配美元和单引号字符

时间:2015-01-26 13:55:02

标签: regex bash sed

我的文件中有以下字符串:

"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变量,脚本应该放在单引号中。但我不能这样做,因为我也在单引号上匹配。

2 个答案:

答案 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"
  • 使用双引号
  • 时转义$
  • 使用群组尽可能避免混淆\$
  • 当简单引用是模式的一部分时使用双引号