在 sed 中的变量后追加文本

Append text after a variable in sed

我有一些使用 GNU-parallel 的代码,它应该用 vclist_2d_*.txt 形式的一系列字符串替换输入文件中的文本,其中 * 是 1 到 10000 之间的数字。

FILES=(vclist_2d_*.txt)

parallel -j1  '
    sed -i "s/50pc\/vclist_2d_.*/50pc\/{}'\''/" 1759_input.py
    sed -i "s/schedule_analysis\/vclist_2d_.*/schedule_analysis\/{}'\_temp\/1759_cs_output.spc''\''/" 1759_input.py
       ' ::: ${FILES[@]}

第一个 sed 命令成功将 1759_input 中已有的 vclist_2d_* 文件替换为 {} 定义的列表 FILES 中的下一个文件.但是,第二个 sed 命令需要替换 vclist_2d_* 并附加文本 _temp/1759_cs_output.spc'

但是,使用上面的代码会发生两件事:

  1. vclist 名称永远不会被列表中的下一个替换
  2. 文本 .temp/1759_cs_output.spc 被附加而不是 _temp/1759_cs_output.spc

我已经尝试了上述 none 的几种变体,其中成功了。我不确定为什么这对第一个 sed 有效但对第二个无效。我想也许 _ 需要转义,但这没有帮助。

我不太明白你用单引号做什么:我假设你的正则表达式模式太贪婪,你需要添加一个被消耗的引号。我会将 .* 更改为 [^']0 —— 即零个或多个非引号字符。

您所做的工作是所需工作量的两倍:将两个替换放入单个 sed 调用中

parallel -j1  ' 
    sed -i "
        s@\(50pc\)/vclist_2d_[^'\'']*@/{}@
        s@\(schedule_analysis\)/vclist_2d_[^'\'']*@/{}_temp/1759_cs_output.spc@
    " 1759_input.py
' ::: "${FILES[@]}"

我为 s/// 命令使用了不同的定界符以减少反斜杠