[英]Sed Regex in Perl Script
使用PERL,我尝试登录到FTP服务器,从特定目录下载所有文件,然后将所有这些文件移动到服务器上的另一个目录。
到目前为止,这是我的代码:
open( my $LFTP,'|-', "lftp -u $ftpuser,$ftppwd -e open $ftpserver" ) or die "Cannot open lftp: $!";
print $LFTP <<"END";
mirror $remoteFiles $datadir
renlist $remoteDir | "sed 's#\(.*\)#mv \"\1\" \"outgoing/archive\/\"#'" > list && source list && !rm list
END
close($LFTP) or die; # die unless lftp exit code is 0
文件正确下载,但不会移动。 我相信问题出在sed命令上。
创建的名为“列表”的临时文件如下所示:
dir1/di2/file1.csv
dir1/di2/file2.csv
dir1/di2/file3.csv
dir1/di2/file4.csv
它看起来应该像这样:
mv "dir1/di2/file1.csv" "outgoing/archive/"
mv "dir1/di2/file2.csv" "outgoing/archive/"
mv "dir1/di2/file3.csv" "outgoing/archive/"
mv "dir1/di2/file4.csv" "outgoing/archive/"
sed regex似乎无法正常工作。 但是,如果我直接在LFTP终端上键入完全相同的命令,则可以正常工作。
您能告诉我我的正则表达式有什么问题吗,为什么从perl脚本中执行它却无法正常工作?
预先感谢您的帮助....
转义\\
字符应该可以解决这个问题:
print $LFTP <<"END";
mirror $remoteFiles $datadir
renlist $remoteDir | "sed 's#\\(.*\\)#mv \"\\1\" \"outgoing/archive\/\"#'"
转义\\
表示perl的字符串文字语法,导致反斜杠转义sed的特殊字符。
问题可能是所有转义(字符前的反斜杠)。 您可以尝试打印结果字符串以检查sed命令在服务器上的外观。
我尝试弄乱它,然后在'1'( \\"\\\\1\\"
)之前使用另一个反斜杠可能会解决您的问题。
我不会使用sed。 假设您正在使用bash(其他shell的语法有些不同):
for file in `renlist $remoteDir`; do
mv "$file" outgoing/archive/
done
这只会遍历您的文件并移动它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.