如果可以替换输入文件:
注意:
这是一个使用临时文件的简单替代方案(它避免像shime's solution 那样将整个输入文件读入内存):
{ printf 'to be prepended'; cat text.txt; } > tmp.txt && mv tmp.txt text.txt
使用 group 命令 ({ ...; ...; }) 比使用 subshell ((...; ...)) 稍微高效一些,例如 0xC0000022L's solution。
优点是:
sed solution 可以简化,如果其意图是在现有内容前添加一个或多个整行(假设输入文件非空):
sed 的i 函数插入整行:
使用 GNU sed:
# Prepends 'to be prepended' *followed by a newline*, i.e. inserts a new line.
# To prepend multiple lines, use '\n' as part of the text.
# -i.old creates a backup of the input file with extension '.old'
sed -i.old '1 i\to be prepended' inFile
一个也适用于 macOS / BSD sed 的便携式变体:
# Prepends 'to be prepended' *followed by a newline*
# To prepend multiple lines, escape the ends of intermediate
# lines with '\'
sed -i.old -e '1 i\
to be prepended' inFile
请注意,\ 后面的文字换行符是必需的。
如果输入文件必须在原地编辑(保留其所有属性的inode):
使用可敬的ed POSIX utility:
注意:
直接添加到第一行(与sed 一样,如果输入文件完全为空(0 字节),这将不起作用):
ed -s text.txt <<EOF
1 s/^/to be prepended/
w
EOF
-
-s 抑制了 ed 的状态消息。
- 注意命令是如何作为多行here-document (
<<EOF\n...\nEOF) 提供给ed 的,即通过stdin;默认情况下,字符串扩展 is 在此类文档中执行(插入 shell 变量); 引用开头的分隔符来抑制它(例如,<<'EOF')。
-
1 将第一行设为当前行
- 函数
s对当前行执行基于正则表达式的字符串替换,如sed;您可以在替换文本中包含 literal 换行符,但它们必须是 \-escaped。
-
w 将结果写回输入文件(为了测试,将w 替换为,p 以仅打印结果,而不修改输入文件)。
添加一个或多个整行:
与sed 一样,i 函数总是在要插入的文本中添加一个尾随换行符。
ed -s text.txt <<EOF
0 i
line 1
line 2
.
w
EOF
-
0 i 使0(文件的开头)成为当前行并开始插入模式(i);请注意,行号是基于 1 的。
- 以下几行是插入之前当前行的文本,以
. 结束。