使用 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 -i
是 editing 文件的更好选择,但如果您将自己限制在 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 插入带有许多换行符的文本的主要内容,如果未能解决你的问题,请参考以下文章