Perl 脚本中的 Sed 正则表达式
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 \"\" \"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 终端上键入完全相同的命令,它工作正常。
你能告诉我我的正则表达式有什么问题吗?为什么它在 perl 脚本中执行时不起作用?
提前感谢您的帮助....
问题可能出在所有转义(字符前的反斜杠)。您可以尝试打印结果字符串以检查 sed 命令在服务器上的样子。
我尝试稍微弄乱它,在“1”(\"\1\"
) 之前再添加一个反斜杠可能会解决您的问题。
我不会使用 sed。假设您使用的是 bash(其他 shell 的语法略有不同):
for file in `renlist $remoteDir`; do
mv "$file" outgoing/archive/
done
这只会遍历您的文件并移动它们。
转义 \
字符应该可以解决问题:
print $LFTP <<"END";
mirror $remoteFiles $datadir
renlist $remoteDir | "sed 's#\(.*\)#mv \"\1\" \"outgoing/archive\/\"#'"
转义 \
允许 perl 的字符串文字语法,导致反斜杠转义 sed 的特殊字符。
我正在尝试使用 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 \"\" \"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 终端上键入完全相同的命令,它工作正常。
你能告诉我我的正则表达式有什么问题吗?为什么它在 perl 脚本中执行时不起作用?
提前感谢您的帮助....
问题可能出在所有转义(字符前的反斜杠)。您可以尝试打印结果字符串以检查 sed 命令在服务器上的样子。
我尝试稍微弄乱它,在“1”(\"\1\"
) 之前再添加一个反斜杠可能会解决您的问题。
我不会使用 sed。假设您使用的是 bash(其他 shell 的语法略有不同):
for file in `renlist $remoteDir`; do
mv "$file" outgoing/archive/
done
这只会遍历您的文件并移动它们。
转义 \
字符应该可以解决问题:
print $LFTP <<"END";
mirror $remoteFiles $datadir
renlist $remoteDir | "sed 's#\(.*\)#mv \"\1\" \"outgoing/archive\/\"#'"
转义 \
允许 perl 的字符串文字语法,导致反斜杠转义 sed 的特殊字符。