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