Bow*_*ark 5 sed text-processing
我有两个文本文件:file1
and file2
,都有几行。
$ cat file1
line one
line two
line three
line four
line five
$ cat file2
line A
line B
line C
line D
line E
line F
Run Code Online (Sandbox Code Playgroud)
我想用一系列的线file1
(从线1_start
到线1_end
)替换一系列的线file2
(从线2_start
到线2_end
)。
例如,代替线2,4
在file1
与线3,5
从file2
。
到目前为止我只能做的是从file2
with 中提取所需的行
$ sed -n 3,5p file2
Run Code Online (Sandbox Code Playgroud)
但这无助于将它们放入file1
. 有可能sed
吗?如果没有,是否可以使用类似的工具?
sed
可以用这样的东西打印给定范围的行:
sed -n 'X,Yp' filename
Run Code Online (Sandbox Code Playgroud)
哪里X
是范围中的第一行和Y
最后一行,两者都包括在内。-n
告诉sed
不要打印任何东西,除非明确告诉要这样做,这就是p
以下范围所做的。
因此,您可以轻松调用 3 次,将其附加到临时文件,然后将该文件移动到您想要的任何位置。您还可以使用cat
和处理替换将它们全部组合起来,如本示例所示(我使用的是我刚刚凭空抽出的行号;$
是文件中的最后一行):
cat <(sed -n '1,5p' file1) <(sed -n '10,12p' file2) <(sed -n '9,$p' file1) > file1.tmp && mv file1.tmp file1
Run Code Online (Sandbox Code Playgroud)
在这里,我们将用file1
10、11 和 12 行替换 6、7 和 8行file2
。
更新:感谢@MiniMax指出这一点,cat
并且可以通过执行以下操作来避免进程替换:
{ sed -n '1,5p' file1; sed -n '10,12p' file2; sed -n '9,$p' file1; } > file1.tmp && mv file1.tmp file1
Run Code Online (Sandbox Code Playgroud)
毕竟,吻。:)
另一种方法sed
是使用r
命令,如果-i
必须使用就地选项,则很方便
$ sed -n '3,5p; 5q;' f2 | sed -e '2r /dev/stdin' -e '2,4d' f1
line one
line C
line D
line E
line five
$ # if /dev/stdin is not supported
$ sed -n '3,5p; 5q;' f2 > t1
$ sed -e '2r t1' -e '2,4d' f1
Run Code Online (Sandbox Code Playgroud)
感谢 don_crissti 提醒我们可以在从文件 2 中获得所需的行后立即退出。