3

我对 bash 脚本比较陌生,因为我需要在超级计算机上管理我的模拟。我目前坚持编写脚本来更改我的 pbs 文件中的特定行。

我的问题有两个阶段。首先,我需要替换文本文件(另一个脚本)中的多行,并覆盖该文件以供以后使用。粗略的想法是:

将第 27、28 和 29 行替换'filename005''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

4

2 回答 2

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 中完成整个工作)。

于 2012-11-02T05:16:29.413 回答
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!

于 2012-11-04T08:36:25.223 回答