使用bash脚本中的sed命令更改文件中包含的路径

时间:2014-03-31 12:48:43

标签: bash sed

我尝试使用bash脚本替换文件的路径行(test.txt)。 test.txt文件中包含的路径如下:

setwd("/media/data/myfolder")

我的bash脚本是:

WORKDIR=$(dirname $(readlink -e $0))
mkdir -p "$WORKDIR/R_results"
outdir="$WORKDIR/R_results"
sed -e 's/^setwd.*/setwd("$outdir")/g' test.txt > test2.txt

当我运行它时,我的输出是:

setwd("$outdir")

我尝试了几种双引号和单引号的组合,但我找不到正确的方法。我希望我已经清楚了。

谢谢!

2 个答案:

答案 0 :(得分:1)

变量也不会在单引号内展开,因此您需要将sed更改为

sed -e "s,^setwd.*,setwd($outdir),g" test.txt > test2.txt

注意,如果$ outdir包含逗号,则会失败。

答案 1 :(得分:0)

由于替换路径包含斜杠,seds///命令的开始和停止位置混淆。使用其他字符,例如% Control-A 。您还需要在脚本周围使用双引号,因为您希望在其中展开shell变量。

WORKDIR=$(dirname $(readlink -e $0))
mkdir -p "$WORKDIR/R_results"
outdir="$WORKDIR/R_results"
sed -e "s%^setwd.*%setwd(\"$outdir\")%g" test.txt > test2.txt

(使用% - 或 Control-A 来实现 - 假设所选字符不会出现在您的文件名中。)