在sed中的变量后附加文本

时间:2015-02-17 16:15:22

标签: sed gnu-parallel bash4

我有一些使用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命令成功替换vclist_2d_*1759_input文件中的FILES文件,而{}定义的sed列表中的下一个vclist_2d_*。但是,第二个_temp/1759_cs_output.spc'命令需要替换vclist并附加文本.temp/1759_cs_output.spc

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

  1. _temp/1759_cs_output.spc名称永远不会被列表中的下一个名称替换
  2. 文字sed会附加而不是_
  3. 我尝试了上述几种变体,但都没有成功。我不确定为什么这对第一个{{1}}而不是第二个{{1}}成功。我想也许{{1}}需要逃避,但这并没有帮助。

1 个答案:

答案 0 :(得分:2)

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

你做了两倍于所需的工作:将两个替换放入一个sed调用中

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

我为s///命令使用了不同的分隔符,以减少反斜杠