perl - 在文件中的指定行之后插入文本

标签 perl awk sed

我需要支持才能对包含大约 5000 行的文件执行以下任务。

输入

    cp abc/P_10_10A.pdb lig.pdb
    cp abc/protein.pdbqt .
    cp abc/run.pl .
    ./run.pl 

    cp abc/P_10_11A.pdb lig.pdb
    cp abc/protein.pdbqt .
    cp abc/run.pl .
    ./run.pl

    cp abc/P_10_11B.pdb lig.pdb
    cp abc/protein.pdbqt .
    cp abc/run.pl .
    ./run.pl

输出

    cp abc/P_10_10A.pdb lig.pdb
    cp abc/protein.pdbqt .
    cp abc/run.pl .
    ./run.pl
    mv *.* P_10_10A

    cp abc/P_10_11A.pdb lig.pdb
    cp abc/protein.pdbqt .
    cp abc/run.pl .
    ./run.pl
    mv *.* P_10_11A

    cp abc/P_10_11B.pdb lig.pdb
    cp abc/protein.pdbqt .
    cp abc/run.pl .
    ./run.pl
    mv *.* P_10_11B

我可以添加 mv . 如下..

    sed '0~4 a\mv *.*  \'       text_file.sh

剩下的我该怎么做?非常感谢。

最佳答案

sed 版本

sed '/^[[:blank:]]*cp /,/^[[:blank:]]*\./ {
      H
      /^[[:blank:]]*\./!d
      s/.*//;x
      s#^\(\(.[[:blank:]]*\)cp \)\([^[:blank:]]*/\([^[:blank:]]*\)\)\(\.pdb.*\)#\1\3\5\2mv *.* \4#
      }' YourFile

信息:

  • 从第一个 cp 开始按段落 (/^[[:blank:]]*cp/,/^[[:blank:]]*\./) 进行,直到 ./
  • 将每一行添加到保存缓冲区 (H)
  • 如果不是段落的最后一行,则从当前工作缓冲区中删除该行(因此不执行任何操作并循环读取下一行)(/^[[:blank:]]*\./!d )
  • 清空该行并交换缓冲区内容 (s/.*//;x)
  • 提取段落的文件名并将其添加到带有mv信息的末尾(s#^\(\(.[ [:空白:]]*\)cp\)\([^[:空白:]]*/\([^[:空白:]]*\)\)\(\.pdb.*\)#\1\3\5\2mv *.*\4#)。这个正则表达式是一个棘手的正则表达式,其中包含一些特殊信息

    • 有一个新行作为第一个字符(由于第一个 H 而不是 h)
    • 我使用多个子组来轻松地将它们用作模式,例如第二组、新行和第一组中包含的第一组空格(如果有)
  • 让 sed 打印结果

    • 修改段落
    • 未触及的行,例如段落之间的

awk 版本

awk -F '[/.]' '
   /cp / {f[n++]=$2}
   /\.\/run/ {print;sub( /\..*/, "mv *.* " f[n=0])}
   7
   ' YourFile

信息:

  • 使用 ./ 作为字段分隔符(-F '[/.]')
  • 对于带有 cp 的每一行,保留文件夹名称和增量数组(第一个索引 = 0)(/cp/{f[n++]=$2})
  • 对于每行./run: (/\.\/run/{print;sub(/\..*/, "mv *.* "f[n =0])})
    • 打印该行
    • 将文本部分替换为mv ...
    • 好名字永远是f[0]
    • 同时重置索引 (n=0)
  • 打印行7

关于perl - 在文件中的指定行之后插入文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41632817/

相关文章:

bash - 如何在 bash 中对数组进行排序并获取唯一值?

sed - 使用sed删除文件中的空行

linux - 使用从其他文件复制的增量序列和名称字段在单个文件中多次复制模板

multithreading - 线程 : worth it for this situation?

perl - 如果我要在 Perl 中使用纯 OO,是否需要 Exporter?

performance - 使用嵌套 for 循环的 Perl 脚本性能缓慢

perl - Net::SFTP perl rsa 认证

awk - 是否可以使用awk将不同的行打印到不同的输出文件

linux - 将文件中的每个单词替换为另一个字典文件中的值

regex - First Re 不能为空