如何使用sed在文件插入内容时保留全部空格
问题描述
我有一个包含如下内容的Shell变量:
Var=" a b c"
还有一个名为file.txt的ASCII文件,内容如下:
line-1 line-2 line-3
我希望使用sed命令将$Var的内容插入到文件的第2行之后,且保留所有空格,即最终得到:
line-1 line-2 a b c line-3
但sed无法保留开头的空格,实际生成内容为:
line-1 line-2 a b c line-3
我尝试了以下命令但均失败,请问需要修改命令的哪部分才能让sed保留开头的空格?
sed -i "2i $Var" file.txt sed -i "2i\\$Var" file.txt
解决方法
问题根源在于shell变量替换和sed的i命令解析逻辑冲突:双引号包裹sed命令时,shell会先展开$Var,而sed的i命令默认会忽略命令后紧跟的前导空白字符,导致变量里的前导空格被丢弃。
推荐使用以下可靠写法:
sed -i '2i'"$Var" file.txt
原理说明
- 单引号
'2i'会阻止shell解析内部内容,确保sed能准确接收到2i这个插入指令; - 双引号
"$Var"让shell正确替换变量,且完整保留变量里的所有空格(包括前导空格); - 两者拼接后,sed收到的指令是
2i a b c,此时i后面的第一个字符就是变量里的前导空格,sed会将其视为插入文本的一部分,而非命令的分隔符,从而完整保留所有空格。
其他可选写法(适配不同sed版本)
如果是BSD sed(如macOS系统),可以用以下写法:
sed -i '' "2i\\ $Var" file.txt
这里需要在i\\后换行,再跟上变量内容,BSD sed要求i命令的插入文本必须在新行开始,这样就能完整保留变量里的空格。
内容的提问来源于stack exchange,提问作者user9751447
相关产品推荐
相关产品推荐

