在sh终端中如何使用含空格的变量作为sed参数?
解决sh终端中向文件首行插入含空格字符串的问题
我来帮你搞定这个棘手的小问题!你遇到的报错本质是shell变量展开时的空格拆分问题,咱们一步步理清原因,再给出正确的写法:
为什么之前的写法会出错?
你最初的命令:
TMP='a b c' sed -e '1i'${TMP} tmp.txt
当shell展开变量${TMP}后,整个命令会被拆成:
sed -e '1i'a b c tmp.txt
shell把'1i'a、b、c、tmp.txt当成了独立参数,sed会把b误认为是要执行的命令,自然就报错了;而你尝试的引号嵌套写法sed -e '"1e'${TMP}'"'是错误的引号拼接,shell无法正确解析,所以也会报“command not found”。
正确的实现方式
方法1:用双引号包裹sed脚本(最简洁)
sh中双引号会保留变量里的空格,同时正常展开变量,直接用这种写法即可:
TMP='a b c' sed -e "1i $TMP" tmp.txt
如果需要直接修改原文件(而非输出到终端),可以加上-i参数(注意:GNU sed和BSD sed的-i用法略有不同):
- GNU sed(Linux):直接用
-ised -i -e "1i $TMP" tmp.txt - BSD sed(macOS等):需要指定备份后缀(比如
.bak,不想留备份可以用空字符串'')sed -i.bak -e "1i $TMP" tmp.txt
方法2:用printf生成sed脚本(适合含特殊字符的场景)
如果你的字符串里包含双引号、反斜杠等特殊字符,用printf来构造sed脚本更安全:
TMP='a b c' printf '1i %s\n' "$TMP" | sed -f - tmp.txt
这里-f -表示从标准输入读取sed脚本,避免了特殊字符的解析问题。
方法3:用POSIX兼容的here-doc(最稳妥的跨平台写法)
如果需要严格兼容POSIX sh,不用担心不同sed版本的差异,可以用here-doc生成临时脚本:
TMP='a b c' sed -i.bak -f - tmp.txt <<EOF 1i $TMP EOF
内容的提问来源于stack exchange,提问作者paul23
相关产品推荐
相关产品推荐

