使用 gnu sed 插入带有许多换行符的文本

Inserting text with many newlines with gnu sed

我有一个 mainfile.txt 包含

 *
 * Some text
 *

使用命令

while read file; do gsed -i '1i'"$(cat mainfile.txt)" "$file";

我将 mainfile.txt 中的文本插入到每个符合某些条件的 file 的开头。但是,似乎 mainfile.txt 中的不同行造成了麻烦。错误显示 gsed: can't find label for jump to `o'。当 mainfile.txt 仅包含一行时,不会发生此错误。在尝试寻找解决方案时,我只发现了如何在 sed 中插入新行,这并不是我想要的。

i 要求每一行以反斜杠结尾,最后一行除外。如果您的文件不是这种情况,它将不起作用。

ed 比非标准 sed -i 更适合 editing 文件,尽管如果您限制自己使用 GNU sed/gsed 而不是 OS 提供的系统 sed 是什么,这不是什么问题。

使用任一命令,将一个文件的内容插入另一个文件的最佳解决方案是使用 r 命令代替 read 文件的内容在地址行之后进入缓冲区(它更像 a 而不是 i):

printf "%s\n" "0r mainfile.txt" w | ed -s "$file"

不幸的是,sed 不像 ed 那样将地址 0 表示为“第一行之前”,因此在此处使用 r 更难。


当然,无需任何命令,只需将一个文件添加到另一个文件即可轻松完成:

cat mainfile.txt "$file" > temp.txt && mv -f temp.txt "$file"

或使用 moreutils 包中的 sponge(1)

cat mainfile.txt "$file" | sponge "$file"

这可能对你有用 (GNU sed):

sed -i '1ecat mainfile.txt' "$file"

仅在文件 $file 的第一行,评估命令 cat mainfile.txt,然后正常打印所有行。

$file 将更新为 mainfile.txt 行。

替代方案,如果 $file 至少有 2 行:

sed -i -e '1h;1r mainfile.txt' -e '1d;2H;2g' "$file"