首页 > 解决方案 > 在bash中将一个文本文件的内容插入另一个文本文件

问题描述

我想将一个文本文件的内容(带有换行符)插入另一个文本文件的预定位置(在某个字符串之后):我尝试了以下内容:基本文件:

cat base
ONE
TWO
THREE

扩展名:

cat ext
100
200
300
400
500
600
700
800
900
A00
B00
C00
D00

和我试过的脚本:

#!/bin/bash
ext=$(<ext)
sed -i "s/TWO/TWO\n$ext/" base

这给了我sed: -e expression #1, char 14: unterminated `s' command

标签: linuxbashsed

解决方案


如果你想直接编辑它一个文件,我总是建议ed而不是非标准的sed -i(如果不同的实现sed支持它的行为不同,这里的常见问题来源):

printf "%s\n" "/TWO/r ext" w | ed -s base

将在base中包含TWO的第一行之后插入文件ext的内容,然后将新版本的base写回磁盘。

如果您必须使用sed,正确的调用将看起来非常相似(毫不奇怪,因为它们是同级命令):

sed -i '/TWO/r ext' base

(不过,这将在基数的每两个之后插入 ext 文件,而不仅仅是第一个。)

两者中的关键是r命令,它读取给定文件的内容并将其插入到具有匹配地址的行之后。比尝试将文件内容读入变量并直接在ed/sed命令中包含文本要好得多。


如果要在行后插入变量的内容,可以使用

printf "%s\n" "/TWO/a" "$ext" . w | ed -s base

(只要变量没有只有句点的行)

或使用 GNU sed

sed -i "/TWO/a ${ext//$'\n'/\\\n}" base

在寻址行之后附加文本


推荐阅读