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
我有一个 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