一个简单的工作ed
:
ed -s file1 <<IN
/Pointer/-r file2
,p
q
IN
-r file1
在指定的文件中读取到所寻址的行之后的地址,在这种情况下,该行是第一行match之前的行Pointer
。因此,file2
即使Pointer
发生在多行中,这也只会插入一次内容。如果要在每条匹配行之前插入它,请添加g
lobal标志:
ed -s file1 <<IN
g/Pointer/-r file2
,p
q
IN
更换,p
用w
,如果你要编辑就地文件。
可接受的sed
答案在大多数情况下都有效,但是如果标记在最后一行,则该命令将无法按预期运行:它将File1
在标记后面插入的内容。
我最初尝试过:
sed '/Pointer/{r file1
N}' file2
它也可以正常工作(就像r
在循环结束时一样神奇),但是如果标记位于最后一行(N
在最后一行之后没有下一行),则会遇到相同的问题。要解决此问题,您可以在输入中添加换行符:
sed '/Pointer/{ # like the first one, but this time even if the
r file1 # marker is on the last line in File2 it
N # will be on the second to last line in
} # the combined input so N will always work;
${ # on the last line of input: if the line is
/^$/!{ # not empty, it means the marker was on the last
s/\n$// # line in File2 so the final empty line in the
} # input was pulled i\n: remove the latter;
//d # if the line is empty, delete it
}' file2 <(printf %s\\n)
这将file2
在每个匹配行之前插入内容。要仅在第一行匹配行之前插入它,可以使用l
oop并仅将n
ext行插入直到到达文件末尾:
sed '/Pointer/{
r file2
N
:l
$!n
$!bl
}
${
/^$/!{
s/\n$//
}
//d
}' file1 <(printf %s\\n)
使用这些sed
解决方案,您将失去就地编辑的能力(但是您可以重定向到另一个文件)。