我想从 test.txt 中取出前两行:
hello
my
name
is
并将它们放在新文件 output.txt 的顶部:
foo
bar
所需输出为 output.txt:
hello
my
foo
bar
使用 sed。但是,使用:
text=$(head test.txt -n 2) | sed -i "1i $text" output.txt
返回错误:
sed: -e expression #1, char 10: extra characters after command
我究竟做错了什么?
答案1
首先,您不必在变量赋值text=
和sed
命令之间使用管道。您需要用命令分隔符替换;
。
其次,您可能会收到错误,因为替换文本的一部分被解释为sed
。您实际上需要引用替换字符串。这可以使用bash
参数扩展运算符来完成@Q
。
text=$(head -n2 test.txt)
sed -i "1i ${text@Q}" output.txt
正如bash
手册页中提到的:
${parameter@operator}
...
Q 扩展是一个字符串,它是参数的值,以可重复用作输入的格式引用。
显然,在第一行之前插入与执行以下操作相同:
head -n2 text.txt > /tmp/temp.txt
cat output.txt >> /tmp/temp.txt && mv /tmp/temp.txt ouput.txt
答案2
完全避免使用 shell 变量:
和
ed
printf '0r !head -n2 test.txt\nwq\n' | ed -s output.txt
使用
sed
(稍微复杂一些,因为r
命令不允许地址0
)head -n 2 test.txt | sed -i -e '1{h;r /dev/stdin' -e 'd;}' -e '2{H;x;}' output.txt
答案3
附加到文件末尾
head -n2 test.txt >> output.txt
附加到文件@steeldriver 的作品开头