我一直在尝试使用以下 SED 命令插入一个文件作为另一个文件的第一行,但没有取得太大成功。每次在第 1 行之后插入文件。是否有一个开关会在第 1 行之前插入?
sed -i '1r file1.txt' file2.txt
提前致谢。
答案1
通过N
命令
前提是file2.txt
有多于一行(否则请参阅另一部分):
sed -i -e '1 { r file1.txt' -e 'N; }' file2.txt
诀窍是用N
命令推迟第一行的打印。
从手册:
氮
将下一行输入追加到模式空间中。
通过e
命令
前提是file2.txt
不为空(否则只需复制一份):
sed -i -e '1 e cat file1.txt' file2.txt
GNUsed
提供了e
执行参数中的命令的命令。结果立即输出。
从手册:
e [命令]
该命令允许将 shell 命令的输入通过管道传送到模式空间。如果没有参数,‘e’命令执行在模式空间中找到的命令,并用输出替换模式空间;尾随换行符被抑制。
相反,如果指定了参数,则“e”命令会将其解释为命令并将其输出发送到输出流。
请注意,与“r”命令不同,该命令的输出将立即打印;相反,“r”命令将输出延迟到当前周期结束。
答案2
该sed
命令r
将在读取下一行输入之前将指定文件的内容放入输出中。不幸的是,您无法指定0
为此命令的地址,因此无法在第一行输入之前插入文件的内容(无需使用保留空间)。
但是,您可以只使用普通的旧cat
.毕竟,它是这连接文件的命令:
$ cat file1.txt file2.txt >out && mv out file2.txt
为了确保您写入的临时文件尚不存在,可以使用以下mktemp
实用程序:
$ tmp="$(mktemp)" && cat file1.txt file2.txt >"$tmp" && mv "$tmp" file2.txt
这在命令行上有点尴尬,但在任何需要写入临时文件的脚本中都是一个很好的预防措施。
答案3
如果您决定避免cat
访问显式临时文件(或通过诸如 之类的缓冲区sponge
),那么它看起来ed
至少会接受 0 地址作为其r
命令:
ed -s file2.txt << EOF
0r file1.txt
wq
EOF
或同等地
printf '0r file1.txt\nwq\n' | ed -s file2.txt
答案4
如果要在同一目录中的多个文件之上插入相同的文件,以下基于拘萨罗南达的回答可能会用到:
for i in file*; do tmp="$(mktemp)" && cat file1 $i >"$tmp" && mv "$tmp" $i; done