是否有单行方式通过sed从字符串中删除美元符号?

时间:2012-01-11 16:44:10

标签: bash sed

我有一个文件,我正在逐行阅读。有些线路上有美元符号,我想用sed删除它们。例如,

echo $line

返回

{On the image of {$p$}-adic regulators},

另一方面,

          echo $line | sed 's/\$//g'

正确返回

 {On the image of {p}-adic regulators},

但是

 title=`echo $line | sed 's/\$//g'`; echo $title

返回

 {On the image of {$p$}-adic regulators},

3 个答案:

答案 0 :(得分:9)

在反引号中使用时,你需要在你的sed命令中转义反斜杠:

title=`echo $line | sed 's/\\$//g'` # note two backslashes before $

答案 1 :(得分:6)

如何使用variable substring replacement。这给出了相同的结果,并且应该更有效率,因为它避免了为了运行sed而必须调用子shell:

[lsc@aphek]$ echo ${line//$/}
{On the image of {p}-adic regulators},

如果您希望坚持使用sed ...

问题是由于反引号语法(`...`)处理反斜杠的方式。要避免此问题,请改用$()语法。

[me@home]$ title=$(echo $line | sed 's/\$//g'); echo $title
{On the image of {p}-adic regulators},

请注意,不符合POSIX标准的旧版本bash可能不支持$()语法。如果你需要支持较旧的炮弹,那么坚持反击,但是如Simon's answer所示,逃避反斜杠。

有关详细信息,请参阅:BashFAQ: Why is $(...) preferred over `...` (backticks)

答案 2 :(得分:0)

由于已发布sed解决方案,因此这是awk变体。

[jaypal:~/Temp] awk '{gsub(/\$/,"",$0);print}' <<< $line
{On the image of {p}-adic regulators},

所以你可以这样做 -

[jaypal:~/Temp] title=$(awk '{gsub(/\$/,"",$0);print}' <<< $line); echo $title
{On the image of {p}-adic regulators},