【问题标题】:Change the path included in a file with sed command in bash script [duplicate]在bash脚本中使用sed命令更改文件中包含的路径[重复]
【发布时间】:2014-05-10 19:33:49
【问题描述】:

我正在尝试使用 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")

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

谢谢!

【问题讨论】:

    标签: bash sed


    【解决方案1】:

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

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

    注意,如果 $outdir 包含逗号,这将失败。

    【讨论】:

    • 如果我这样做: echo "$outdir" /media/R_results 这是我要放入 test.txt 文件的路径(替换 /media/data/myfolder)。如果我运行 sed -e "s/^setwd.*/setwd($outdir)/g" ,我会得到 setwd() 作为输出。还有其他建议吗?
    • @user3481031 奇怪,想不出会导致这种情况的情况
    • 好吧,对不起,我的错。当我运行你的命令时,我收到以下错误: sed: -e expression #1, char 21: unknown option to `s 当然输出文件中的路径没有改变。
    • 如果文件周围的双引号是强制性的 sed -e "s/^setwd.*/setwd(\"$outdir\")/g" 就像源代码一样。
    • 仍然有同样的错误:sed: -e expression #1, char 21: unknown option to `s' 我认为这与路径中包含的“/”有关..跨度>
    【解决方案2】:

    由于替换路径包含斜杠,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 假设所选字符不会出现在您的文件名中。)

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多