使用 Perl 与 Sed 和 Capture Groups 将另一个字符串添加到字符串的末尾

pch*_*oor 0 perl sed

我需要遍历每个文件并在文件中特定语句的末尾添加一个新字符串。我已经有了包含此语句的每个此类文件的列表(实际上每个文件都是 SAS 代码)。我的目标是先创建备份后就地编辑每个文件。所以我决定使用 PERL 在 AIX 7.1 机器上进行就地编辑。我打算在每个文件中添加的特定语句将始终有 3 个关键字:FILENAME、FTP 和 HOST 标识这样的语句,并且它总是以分号终止。该语句也可以在同一个文件中多次出现。

文件中的语句示例是:

    FILENAME  IN   FTP  "" LS  HOST=XXXX USER=XXXX PASS=XXXX ;
Run Code Online (Sandbox Code Playgroud)

相同类型的语句也可以在多行中以及语句上的一些附加选项。

    FILENAME  Test   FTP  "Sample.xls" 
    CD="ABCDEFG"
    USER=XXXXX
    PASS=XXXXX
    HOST=XXXXX
    BINARY
    ;
Run Code Online (Sandbox Code Playgroud)

或者

    filename Novell ftp &pitalist.
        HOST=&HOST.          
        USER="XXXXXXXX"
        PASS="XXXXXXX"
        DEBUG
        LRECL=10000;
Run Code Online (Sandbox Code Playgroud)

我的目标是在上面的字符串末尾添加一个新字符串:%ftps_opts在结束分号之前。现有语句和这个新字符串之间应该至少有一个空格或换行符,如下所示。

    FILENAME  IN   FTP  "" LS  HOST=XXXX USER=XXXX PASS=XXXX %ftps_opts;

    FILENAME  Test   FTP  "Sample.xls" 
    CD="ABCDEFG"
    USER=XXXXX
    PASS=XXXXX
    HOST=XXXXX
    BINARY
    %ftps_opts;

    filename Novell ftp &pitalist.
        HOST=&HOST.          
        USER="XXXXXXXX"
        PASS="XXXXXXX"
        DEBUG
        LRECL=10000 %ftps_opts;
    
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 Capture group 和 PERL 来捕获每个文件中分号之前的现有语句 ,然后在它的末尾附加一个空格或换行符的新字符串?Input.txt 文件包含具有 FILENAME FTP 语句的文件列表,如上所示。

像这样的事情:

    #!/bin/bash
    input="~/Input.txt"
    while IFS= read -r line
       do
          echo "$line" 
          perl -p -i.orig -e 's/(capture group)/\1 %ftps_opts /gi' "$line" 
          echo "done"
      done < "$input"
Run Code Online (Sandbox Code Playgroud)

谢谢你。

cho*_*oba 6

您可以告诉 Perl 处理整个文件而不是逐行处理它:

perl -0777 -pe 's/(filename[^;]*ftp[^;]*host[^;]*)/$1 %ftps_opts/gi' -- file
Run Code Online (Sandbox Code Playgroud)