sed中变量间添加换行:文件顶部插入双变量换行问题
解决sed插入多行变量到文件顶部的问题
嘿,我懂你遇到的糟心事了——想用sed把两个变量各占一行插到文件顶部,结果直接拼一起就算了,试了\n要么没效果,要么在Windows记事本里显示得乱七八糟。这其实是俩问题:一是shell对转义字符的处理逻辑,二是不同系统换行符的差异在搞鬼。
给你几个实用的解决方案,分场景来看:
1. 类Unix系统(Linux/macOS)下的sed正确写法
Linux或macOS里的sed本身是支持\n作为换行的,但要注意shell的引号规则——双引号里的\n不会被shell自动转换成实际换行,得用点小技巧绕开:
方法一:用bash的ANSI-C转义让shell解析
\nsed -i "1s/^/${var1}$'\n'${var2}/" "$file"这里
$'\n'会被bash直接转换成真实的换行符,再传给sed处理,插入后两个变量自然就各占一行了。方法二:混合单双引号,让sed直接识别
\nsed -i '1s/^/'"$var1"'\n'"$var2"'/' "$file"单引号里的内容不会被shell展开,所以
\n能原封不动传给sed;而变量$var1和$var2放在双引号里正常展开,这样sed就能准确解析换行指令了。
2. 搞定Windows记事本的显示异常问题
你说用\n后记事本显示异常,这是因为Windows系统认CRLF(\r\n)当换行符,而类Unix的sed默认插的是LF(\n),记事本不认LF,所以会显示成方块或者不换行。
如果你的文件是给Windows环境用的,得插入CRLF格式的换行:
sed -i "1s/^/${var1}$'\r\n'${var2}$'\r'/" "$file"
这里$'\r\n'就是Windows标准的换行符,插完后记事本就能正常识别换行啦。
3. 更直观的替代方案:用echo+cat组合
要是觉得sed的写法太绕,也可以换个思路,用echo和cat组合,逻辑更清晰:
echo -e "$var1\n$var2" | cat - "$file" > temp_file && mv temp_file "$file"
echo -e会把\n解析成实际换行,输出两个变量各一行;cat - "$file"把echo的输出和原文件内容合并(-代表读取标准输入);- 最后用临时文件替换原文件(不能直接重定向到原文件,否则会先清空文件导致内容丢失)。
这么操作完,不管是在类Unix系统还是Windows记事本里,都能正常显示换行啦。
内容的提问来源于stack exchange,提问作者user9526185
相关产品推荐
相关产品推荐

