Perl 一行可以将匹配的模式行打印到文件并删除原始文件中的那些行吗?

Can Perl one-liner print matching pattern lines to a file and delete that lines in the original file?

我有一个 file1 有行

abc
dfg
hij
cab

我想匹配 file1 中的模式 ab 并打印到 file2。之后从 file1 中删除这些行。然后file1有下面几行

dfg
hij

file2有行

abc
cab

目前,我正在用两行代码来完成

perl -ne '/ab/i && print' file1.csv > file2.csv
perl -n -i.bak -e 'print unless m/ab/' file1.csv

谁能给我一个单行的 Perl 代码?

谢谢,

我会用 ed 代替:

$ rm file2.csv # Just in case it already exists
$ ed -s file1.csv <<'EOF'
g/ab/.W file2.csv\
d
w
EOF

(对于匹配基本正则表达式ab的每一行,将其附加到file2.csv并删除该行,最后将修改后的缓冲区写回file1.csv)。

但是一个简单的 perl one-liner:

$ perl -ni -e 'if (/ab/) { print STDERR } else { print }' file1.csv 2>file2.csv

这会将匹配行打印到标准错误并使用 shell 将其重定向到 file2.csv,同时仅使用 non-matching 修改 file1.csv in-place行。

perl -i -ne'print { /ab/ ? *STDERR : select() } $_' file1.csv 2>file2.csv

但错误消息最终出现在 file2.csv

这些版本没有这个问题:

perl -i -ne'
   BEGIN { open $fh, ">&=", 3; }
   print { /ab/ ? $fh : select() } $_;
' file1.csv 3>file2.csv
perl -i -ne'
   BEGIN { open $fh, ">", shift(@ARGV); }
   print { /ab/ ? $fh : select() } $_;
' file2.csv file1.csv