我有一些使用GNU并行的代码,它应该用表单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'追加到该命令中。
但是,对于上面的代码,发生了两件事:
vclist名称永远不会被列表中的下一个替换.temp/1759_cs_output.spc被附加,而不是_temp/1759_cs_output.spc我试过上述几种变体,但没有一种成功。我不知道为什么这对第一个sed成功,但对第二个不成功。我想也许_需要逃跑,但这没有帮助。
发布于 2015-02-17 17:50:47
我不太明白你在用单引号做什么:我要假设你的正则表达式太贪婪了,你需要添加一个被消耗掉的引号。我将把.*改为[^']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///命令使用了不同的分隔符
https://stackoverflow.com/questions/28565905
复制相似问题