我对bash脚本编程比较陌生,开始不需要在超级计算机上管理我的模拟。我目前只是在写一个脚本来改变我的pbs文件中的特定行。
我的问题分为两个阶段。首先,我需要替换文本文件(另一个脚本)中的多行,并覆盖该文件供以后使用。粗略的想法是:
将
'filename005'
的第27,28和29行替换为'text1=000'
,'text2=005'
和'text3=010'
接下来,我想以递归方式为一组带有编号后缀的文本文件执行此操作,并且编号会影响替换的文本。
到目前为止我的代码是:
#!/bin/bash
for ((i = 1; i < 10; i++))
do
let NUM=i*5
let OLD=NUM-5
let NOW=NUM
let NEW=NUM+5
let FILE=$(printf "filename%03g" $NUM)
sed "27 c\text1=$OLD" $FILE
sed "28 c\text2=$NOW" $FILE
sed "29 c\text3=$NEW" $FILE
done
我知道在我的代码的最后4行中有一些错误,我仍在研究实现sed
的正确方法。感谢任何提示!
谢谢! CS
答案 0 :(得分:1)
采取您的规范的第一行:
Replace lines 27:29 of filename005, with text1=000; text2=005; text3=010
那变为:
sed -e '27,29c\
text1=000\
text2=005\
text3=010' filename005
冲洗并重复。反斜杠表示sed
更改仍在继续。如果您的实际数据行不需要以反斜杠结尾,那么您自己就更容易了。
你可以玩:
seq 1 35 |
sed -e '27,29c\
text1=000\
text2=005\
text3=010'
看看会发生什么,而不会有损坏珍贵档案的风险。根据规范行,您可以编写一个sed
脚本来生成规范中的sed
脚本(尽管我很想使用Perl或awk
;实际上,我可能会在Perl完成整个工作。)
答案 1 :(得分:0)
好的,我发现在进行内联替换后,我需要将代码写入临时文件。因此,使用递归循环和多行替换(以及其他小调整):
for ((i = 1; i < 10; i++ ))
do
let NUM=i*5
let OLD=NUM-5
let NOW=NUM
let NEW=NUM+5
FILE=`printf "filename%03g" $NUM`
sed -e "27,29 c\
OLD=$OLD\n\
NOW=$NOW\n\
NEW=$NEW" $FILE >temp.tmp && mv temp.tmp $FILE
done
如果在此上下文中使用sed
有更优雅的方法,请告诉我。再次感谢@Johnathan!