我有一些使用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
但是,上面的代码会发生两件事:
_temp/1759_cs_output.spc
名称永远不会被列表中的下一个名称替换sed
会附加而不是_
我尝试了上述几种变体,但都没有成功。我不确定为什么这对第一个{{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///
命令使用了不同的分隔符,以减少反斜杠