为什么sed命令可以直接工作,当我在脚本文件中写入时无法工作?

时间:2012-12-21 07:38:15

标签: bash shell sed command sh

这是我的背景: 我有一个名为profile的个人资料

# file: profile

MY_PATH = "/home/deng/default"
MY_NAME = "deng" 

我的测试文件:

#!/bin/sh
#file: test.sh
DJ_PATH="/deng/jian/doc"

OUTPUT_PATH="\"${DJ_PATH}/output\""
echo "OUTPUT_PATH = ${OUTPUT_PATH}"

DOC_KEY="MY_PATH"
DOC_VALUE=${OUTPUT_PATH}
echo "DOC_VALUE = ${DOC_VALUE}"

echo "sed 's:[ \t]*${DOC_KEY}[ \t]*=.*:${DOC_KEY} = ${DOC_VALUE}:' profile"
sed 's:[ \t]*${DOC_KEY}[ \t]*=.*:${DOC_KEY} = ${DOC_VALUE}:' profile

在终端我运行

$ ./test.sh 

,输出

1  OUTPUT_PATH = "/deng/jian/doc/output"
2  DOC_VALUE = "/deng/jian/doc/output"
3  sed 's:[ \t]*MY_PATH[ \t]*=.*:MY_PATH = "/deng/jian/doc/output":' profile
4   MY_PATH = "/home/deng/default"
5   MY_NAME = "deng"

它看起来配置文件中的文本没有被我想要设置的DOC_VALUE(“/ deng / jian / doc / output”)替换。但是我在输出行3中运行了命令。它可以工作:

sed 's:[ \t]*MY_PATH[ \t]*=.*:MY_PATH = "/deng/jian/doc/output":' profile

输出:

MY_PATH = "/deng/jian/doc/output"
MY_NAME = "deng"

那发生了什么?我在test.sh

中编写的命令有什么不同
sed 's:[ \t]*${DOC_KEY}[ \t]*=.*:${DOC_KEY} = ${DOC_VALUE}:' profile

和我直接输入的命令?

sed 's:[ \t]*MY_PATH[ \t]*=.*:MY_PATH = "/deng/jian/doc/output":' profile

2 个答案:

答案 0 :(得分:2)

在文件中使用',不允许bash解释变量。

更改为"

sed "s:[ \t]*${DOC_KEY}[ \t]*=.*:${DOC_KEY} = ${DOC_VALUE}:" profile

或使用多个'

打破
sed 's:[ \t]*'${DOC_KEY}'[ \t]*=.*:'${DOC_KEY}' = '${DOC_VALUE}':' profile

答案 1 :(得分:0)

看看这个例子:

#!/bin/sh

S=foo
D=bar

echo 'foo' | sed 's/${S}/${D}/g'       # echoes foo
echo 'foo' | sed 's/'${S}'/'${D}'/g'   # echoes bar