我有一个文件,我正在逐行阅读。有些线路上有美元符号,我想用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},
答案 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},