Perl脚本中的Sed-Regex



使用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命令上。

创建的名为"list"的临时文件如下所示:

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正则表达式似乎工作不正常。但是,如果我直接在LFTP终端上键入完全相同的命令,它可以正常工作。

你能告诉我我的regex有什么问题吗?为什么它在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

这只会遍历文件并移动它们。

相关内容

  • 没有找到相关文章

最新更新