我可以将其附加到文件的开头:
sed -i '1s/^/word\n/' file
我是阅读如果我使用双引号我可以扩展变量,所以我尝试:
sed -i "1s/^/$(printenv)\n/" file
我最终回来了:
sed: -e expression #1, char 15: unterminated `s' command
这里发生了什么。是和变量的内容有关还是其他什么?
答案1
我认为以下方法会起作用:
sed -i '1 e printenv' file
来自 GNU sed 手册:
'e COMMAND'
Executes COMMAND and sends its output to the output stream. The
command can run across multiple lines, all but the last ending with
a back-slash.
或者,您可以使用cat
,但这需要创建一个临时文件:
cat <(printenv) file > temporary_file; mv temporary_file file
如果您的计算机上安装了该软件包moreutils
,您可以使用以下命令来避免手动创建临时文件sponge
:
cat <(printenv) file | sponge file
答案2
插入内容前第 1 行:
ed -s file <<< $'0r !printenv\nwq'
插入内容后第 1 行:
ed -s file <<< $'1r !printenv\nwq'
答案3
为了更直接地回答OP的问题,是的,它与子shell输出的内容有关。 Bash 可识别的在双引号内保留含义的特殊字符将被 shell 错误地解释,并且printenv
会给你带来很多。最有可能导致该错误的原因unterminated 's'
是 的值printenv
有多行长并且sed
期望 s 命令在该行末尾完成。无论您想要替换到该sed
命令中的任何内容,都需要进行预处理以删除或转义特殊字符、替换newlines
为文字\n
s 等。