sed:-e 表达式 #1,字符 10:命令后的额外字符

sed:-e 表达式 #1,字符 10:命令后的额外字符

我想从 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 的作品开头

相关内容