jks*_*hah 17 linux perl awk grep sed
我想将符合特定模式的行从file1移动到file2.类似于在Windows中从一个文件切换到另一个文件的操作
例
比方说,我希望削减方含所有行bar从文件1,然后粘贴到新创建的文件2
输入:
文件1
bla foo bla
bla bar bla
bla aaa bla
bla bar bla
bla foo bla
Run Code Online (Sandbox Code Playgroud)
处理后所需的输出:
文件1
bla foo bla
bla aaa bla
bla foo bla
Run Code Online (Sandbox Code Playgroud)
文件2
bla bar bla
bla bar bla
Run Code Online (Sandbox Code Playgroud)
我试过了什么
grep创建所需的file2但不修改file1
grep 'bar' file1 > file2
Run Code Online (Sandbox Code Playgroud)
sed -i修改所需的file1但不创建file2
sed -i '/bar/d' file1
Run Code Online (Sandbox Code Playgroud)
如果我一个接一个地执行两个命令,我得到了理想的结果.但在这里,我正在寻找一个出于好奇的单行命令,并使脚本更简洁.
非常感谢您的帮助.
pot*_*ong 17
这可能适合你(GNU sed):
sed -i -e '/bar/{w file2' -e 'd}' file1
Run Code Online (Sandbox Code Playgroud)
替代:
sed -i -e '/bar/w file2' -e '//d' file1
Run Code Online (Sandbox Code Playgroud)
要附加到file2,请写入临时文件并使用cat在bash脚本中附加到文件末尾,或者使用:
sed -i -e '/bar/w tmpfile' -e '$e cat tmpfile >> file2 && rm tmpfile' -e '//d' file1
Run Code Online (Sandbox Code Playgroud)
注意对于最后一个解决方案,一次只能修改一个输入文件.
您可以使用perl并在打印时根据正则表达式的匹配选择不同的文件句柄:
perl -i.bak -ne 'BEGIN { open $oh, q|>|, pop or die } { print { m/bar/ ? $oh : q|ARGVOUT| } $_ }' file1 file2
Run Code Online (Sandbox Code Playgroud)
它产生:
==> file1 <==
bla foo bla
bla aaa bla
bla foo bla
==> file2 <==
bla bar bla
bla bar bla
Run Code Online (Sandbox Code Playgroud)