sed 内的子 shell

sed 内的子 shell

我可以将其附加到文件的开头:

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为文字\ns 等。

相关内容