Sed命令给出意想不到的结果

时间:2013-05-10 09:28:57

标签: linux shell unix sed

下面是我试图找到意义的shell脚本。

sed 's/19984 $/98400 /' | sed 's/19992 $/99200 /'

我预计19984 $将被替换为98400,此字符串将传递给下一个sed命令,用99200替换19992 $。

但是当我使用示例输入

执行下面的脚本时
echo "19984 $ need to be  replaced with 98400  "| sed 's/19984 $/98400 /' | sed 's/19992 $/99200 /'

我得到相同的字符串

"19984 $ need to be  replaced with 98400"

我希望我在这里失踪的东西。请帮我。我是shell脚本的新手。 提前谢谢!

1 个答案:

答案 0 :(得分:1)

对于sed,$是一个保留字符,您必须将其转义(\$)才能正确解析:

$ echo "19984 $ need to be  replaced with 98400  "| sed 's/19984 \$/98400 /' 
98400  need to be  replaced with 98400

所有在一起:

$ echo "19984 $ need to be  replaced with 98400  "| sed 's/19984 \$/98400 /' | sed 's/19992 \$/99200 /'
98400  need to be  replaced with 98400

所以你需要保持原样。

$可能意味着很多事情:
- 正常人物。
- 行尾。
- 变量的名称。

你获得代码的方式意味着第二种情况:行尾:

$ echo "19984 " | sed 's/19984 $/98400 /'
98400
$ echo "19984 something" | sed 's/19984 $/98400 /'
19984 something

所以sed将仅匹配行以19984结尾的情况。否则它将不匹配。