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

时间:2012-11-02 05:07:11

标签: bash loops replace sed

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

2 个答案:

答案 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!