【问题标题】:Using Perl with Sed and Capture Groups to add another string to end of a string将 Perl 与 Sed 和捕获组一起使用以将另一个字符串添加到字符串的末尾
【发布时间】:2020-11-05 04:50:13
【问题描述】:

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

文件中的语句示例为:

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

同一类型的语句也可以出现在多行中,并且语句上有一些附加选项。

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

    filename Novell ftp &pitalist.
        HOST=&HOST.          
        USER="XXXXXXXX"
        PASS="XXXXXXX"
        DEBUG
        LRECL=10000;

我的目标是在上述字符串的末尾添加一个新字符串:%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;
    

有没有办法使用捕获组和 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"

谢谢。

【问题讨论】:

  • “文件名”记录是否总是用空行分隔?文件中是否还有其他类型的记录? How to create a Minimal, Reproducible Example
  • 并不总是用空行分隔。此外,每个文件中可能还有其他语句,它们确实具有 FILENAME 关键字,但在此类语句中不会包含所有 3 个关键字 FILENAME 、 FTP 和 HOST 。本质上,我打算添加的特定语句由这 3 个关键字标识,直到此类语句的分号结尾。
  • 分号是否出现在文件中的其他任何地方?包括密码字段。
  • 是的,格伦,他们确实出现了。事实上,根据 SAS 语言语法,SAS 代码中的大多数语句通常以分号结尾。

标签: perl sed


【解决方案1】:

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

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

【讨论】:

  • 出色的解决方案,简短而简单。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-02-07
  • 2021-09-06
  • 2020-04-13
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 2011-12-21
  • 2021-09-17
相关资源
最近更新 更多