通过N命令

通过N命令

我一直在尝试使用以下 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

相关内容