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

Posted

技术标签:

【中文标题】使用 gnu sed 插入带有许多换行符的文本【英文标题】:Inserting text with many newlines with gnu sed 【发布时间】:2021-09-21 05:36:55 【问题描述】:

我有一个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 中插入新行,这并不是我想要的。

【问题讨论】:

看your question history我想你应该读这个:What does it mean to accept an answer? 【参考方案1】:

i 要求插入的每一行都以反斜杠结尾,最后一行除外。如果您的文件不是这种情况,它将无法正常工作。

ed 比非标准的 sed -iediting 文件的更好选择,但如果您将自己限制在 GNU sed/gsed 而不是任何操作系统提供的系统sed 是,这不是问题。

使用任一命令,将一个文件的内容插入另一个文件的最佳解决方案是使用r 命令代替r将文件的内容读取到寻址行之后的缓冲区中(这种方式更像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"

【讨论】:

赞成cat+mv 但在两者之间添加一个成功测试&& 以使其成为cat mainfile.txt "$file" > temp.txt && mv -f temp.txt "$file" 这样您就不会通过mv 删除您的输入文件为空如果cat 失败(例如,如果temp.txt 不可写或mainfile.txt 不可读取),则将文件放到它上面。 非常感谢! printf [...] | ed -s "$file" 解决方案完全符合我的要求。【参考方案2】:

这可能对你有用(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"

【讨论】:

以上是关于使用 gnu sed 插入带有许多换行符的文本的主要内容,如果未能解决你的问题,请参考以下文章

在没有换行符的情况下使用 sed 的追加/更改/插入

用sed 怎么替换包含换行符\n的文本.比如这些

如何在文件中固定数量的字符后插入换行符

Linux Sed命令具体解释+怎样替换换行符" "(非常多面试问道)

Sed命令详解+如何替换换行符

求助sed命令匹配并替换无效的换行符