使用Bash替换多个文件中的特定行



我对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!

相关内容

  • 没有找到相关文章

最新更新