我需要遍历每个文件并在文件中特定语句的末尾添加一个新字符串。我已经有了包含此语句的每个此类文件的列表(实际上每个文件都是 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)
谢谢你。
您可以告诉 Perl 处理整个文件而不是逐行处理它:
perl -0777 -pe 's/(filename[^;]*ftp[^;]*host[^;]*)/$1 %ftps_opts/gi' -- file
Run Code Online (Sandbox Code Playgroud)