【发布时间】: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 代码中的大多数语句通常以分号结尾。