【问题标题】:Replacing specific lines in multiple files using bash使用 bash 替换多个文件中的特定行
【发布时间】:2012-10-22 18:43:44
【问题描述】:

我对 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 的正确方法。感谢任何提示!

谢谢! 计算机科学

【问题讨论】:

  • 一种更可持续的方法可能是让您的脚本从配置文件或一组环境变量中读取其参数。

标签: bash loops replace sed


【解决方案1】:

好的,在发现要进行内联替换后,我设法让我的代码工作,我需要将它写入一个临时文件。因此,使用递归循环和多行替换(以及其他小调整):

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!

【讨论】:

    【解决方案2】:

    获取规范的第一行:

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

    【讨论】:

    • 嗨@Johnathan Leffler,谢谢你,我会在周一回到办公室时检查并投票。
    • “替换文本”是什么意思?答案可能是“是”,但在我知道你想做什么之前,我无法告诉你该怎么做。
    • 抱歉这个模棱两可的问题,我在思考之前问过。在完善我的问题之前,我会先尝试您之前的建议。
    • 嗨@Johnathan,我在一个简单的案例中尝试了你的第一个建议代码:用文本替换 filename005 中的第 27,28 和 29 行,但是当我重新打开文件时这些行没有任何变化。话虽如此,当我执行脚本时,带有替换行的文件内容会显示在我的终端上。我是否必须指定原始文件名才能覆盖它?
    • 我展示的代码在标准输出上显示了编辑后的输出。如果你想写更新文件,你必须组织它。如果您使用 GNU sed 并且您的文件既不是符号链接也不是多重链接,那么您可以安全地使用 -i 选项进行覆盖。如果您正在处理符号链接或多重链接文件,那么您应该写入一个临时文件,然后在原始文件上 复制 临时文件 - GNU sed -i 不处理这个问题。如果您没有 GNU sed 但您有简单的文件,则可以写入临时文件并将临时文件 移动 到原始文件(比复制更快)。
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 2016-06-27
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    相关资源
    最近更新 更多