我试图用相同数量的行和来自另一个文件(file2)的相同位置替换一个文件(file1)中的行。我发现
sed -n 1,5p file2
Run Code Online (Sandbox Code Playgroud)
将从file2 中提取前五行。如何使用这些行并替换file1 中的前五行?
对于使用 GNU 进行就地编辑sed
,有一个-i
选项。该R
EAD线命令,(它读取一个文件名为一行,则后再次运行时,每行),在这里很有用。两行版本:
sed -i '1,5{R file2
d}' file1
Run Code Online (Sandbox Code Playgroud)
笔记:
R
ead line的输出不会被d
后面的 elete改变。 在从file1删除一行后R
插入来自file2 的 每一行。在不能先走,(如果它这样做了,命令将不会运行,就像是在) d
d
R
d
next
awk
该R
EAD线(比如到文件名中的所有命令),需要的文件名由换行符分隔。通常的;
命令分隔符被忽略,R
解释R file2;
为以文字“ ;
”结尾的文件名。与空格相同,R
解释R file2 ;
为以文字“ ;
”结尾的文件名
R
不受 影响-i
,因此不会更改file2。
为了将其放在一行上,可以传递两个与换行符连接以形成脚本的-e
xpressions :sed
sed
sed -i -e '1,5{R file2' -e 'd}' file1
Run Code Online (Sandbox Code Playgroud)
否则,您不需要sed
:
{ head -n 5 file2; tail -n +6 file1; } > file3
Run Code Online (Sandbox Code Playgroud)
在一般情况下,以取代$x1
以$y1
线file1
带$x2
,以$y2
线file2
:
sed "$x2,\$!d;$y2 q" file2 | sed -i -e "$x1 r /dev/stdin" -e "$x1,$y1 d" file1
Run Code Online (Sandbox Code Playgroud)
或者:
{
head -n "$((x1 - 1))"
tail -n "+$x2" < file2 | head -n "$((y2 - x2 + 1))"
tail -n "+$((y1 - x1 + 2))"
} < file1 > file3
Run Code Online (Sandbox Code Playgroud)
有点作弊(不是纯粹的sed
),使用sponge
:
{ sed -n 1,5p file2 ; sed -n '6,$p' file1 } | sponge file1
Run Code Online (Sandbox Code Playgroud)