我对bash脚本的新手是刚从超级计算机上管理我的仿真之后开始的。目前,我坚持编写一个脚本以更改PBS文件中的特定行。
我的问题有2个阶段。首先,我需要在文本文件(另一个脚本)中替换许多行,然后覆盖该文件以供以后使用。大概的想法是:
用
替换'text1=000'
,'text2=005'
和'text3=010'
'filename005'
的第27、28和29行
接下来,我想为带有编号后缀的一组文本文件递归地执行此操作,并且编号会影响替换的文本。
到目前为止我的代码是:
#!/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 ctext1=$OLD" $FILE
sed "28 ctext2=$NOW" $FILE
sed "29 ctext3=$NEW" $FILE
done
我知道代码的最后4行中存在一些错误,而且我仍在研究实现sed
的正确方法。感谢任何提示!
谢谢!CS
采用规范的第一行:
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中完成整个工作)。
好吧,我设法使我的代码在发现在线替换之后,我需要将其写入临时文件。因此,随着递归循环和多行更换(以及其他小调整):
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=$OLDn
NOW=$NOWn
NEW=$NEW" $FILE >temp.tmp && mv temp.tmp $FILE
done
在这种情况下,是否有一种更优雅的方法来使用sed
。再次感谢@johnathan!