如何使用sed命令在文件中写入\n字符?
解决Sed替换时保留
\n原字符的问题 我明白你遇到的痛点了——用sed替换字符串时,本来想保留\n这两个字符,结果被解析成了实际的换行,导致输出和预期不符。咱们一步步来解决这个问题:
问题回顾
你的示例代码:
string="status=\"translated\">NIRANJAN\\nKUMAR" sed -i 's/status="translated">/'"$string"' /g' text.txt
目标文件text.txt原有内容:status="translated">Fixes
当前输出(\n变成了换行):
status="translated">NIRANJAN KUMAR
期望输出:status="translated">NIRANJAN\nKUMAR
问题根源
这里的核心是Shell和sed对转义字符的双重解析:
- Shell会先把变量里的
\\n解析成\n - sed接收到
\n后,会把它当成换行符处理,而不是保留原字符
所以我们要做的是,让sed最终拿到\\n,这样它才会把\\解析成单个\,从而保留\n。
解决步骤
下面是几种可行的解决方案,你可以根据需求选择:
方案1:修改变量中的转义字符
把变量里的\\n改成\\\\n,这样Shell解析后会变成\\n,sed处理时就会保留\n:
string="status=\"translated\">NIRANJAN\\\\nKUMAR" sed -i 's/status="translated">/'"$string"'/g' text.txt
方案2:用printf处理转义,避免Shell解析
如果不想修改变量的写法,可以用printf来输出字面量的\n,确保sed拿到正确的内容:
string='status="translated">NIRANJAN\nKUMAR' sed -i "s/status=\"translated\">/$(printf '%s' "$string")/g" text.txt
方案3:直接在sed命令中写\\n
如果变量的内容不需要复用,也可以直接在sed的替换字符串里写\\n,这样sed会直接解析成\n:
sed -i 's/status="translated">/status="translated">NIRANJAN\\nKUMAR/g' text.txt
验证结果
执行上述任意方案后,text.txt的内容都会变成你期望的:
status="translated">NIRANJAN\nKUMAR
注意事项
如果你用的是macOS的BSD sed(而非Linux的GNU sed),-i选项需要加一个空参数,比如:
sed -i '' 's/.../.../g' text.txt
内容的提问来源于stack exchange,提问作者Niranjan Kumar
相关产品推荐
相关产品推荐

