如何在MSYS2中添加换行符? heredoc写入文件换行失败求助
解决Bash Heredoc写入文件时换行符失效的问题
嘿,我来帮你搞定这个问题!你遇到的情况是因为两个小细节没处理好,导致换行符完全没起到作用:
问题出在哪?
- Heredoc的转义解析规则:默认情况下,Bash的Heredoc不会解析
\r\n这类转义序列,只会把它们当成普通字符串输出,所以你才会看到明文的\r\n。 - echo输出的变量展开坑:当你用
echo $VAR而不是echo "$VAR"时,Bash会把变量里的所有空白字符(包括换行、制表符)都替换成空格,直接把两行内容揉成了一行。
几个可行的解决办法
办法1:让Heredoc解析转义,同时带引号输出变量
如果想让\n生效,你需要让Heredoc开启转义解析(不要给分隔符加单引号),同时记得给变量加引号输出,另外Windows路径里的\要转义成\\避免被错误解析:
read -r -d '' VAR << EOM add "main.exe" "/Windows\\System32\\main.exe" add "main.exe" "/Windows\\System32\\main.exe" EOM echo "$VAR" > test.txt
这样生成的test.txt里就会是两行内容,用的是Unix风格的换行符(\n)。
办法2:生成Windows风格的换行(\r\n)
如果你的目标是生成Windows格式的换行(每行末尾带\r\n),用printf处理会更稳妥:
read -r -d '' VAR << 'EOM' add "main.exe" "/Windows\System32\main.exe" add "main.exe" "/Windows\System32\main.exe" EOM printf '%s\r\n' "$VAR" > test.txt
这里用<< 'EOM'让Heredoc完全保留原始内容(包括路径里的\),然后用printf给每一行加上Windows换行符。
办法3:直接在Heredoc里手动换行(最简单!)
其实最省事的方式就是直接在Heredoc里敲回车换行,根本不用写\r\n:
read -r -d '' VAR << 'EOM' add "main.exe" "/Windows\System32\main.exe" add "main.exe" "/Windows\System32\main.exe" EOM echo "$VAR" > test.txt
这样输出的文件自然就是两行。如果需要转成Windows风格换行,再加一步替换即可:
echo "$VAR" | sed 's/$/\r/' > test.txt
内容的提问来源于stack exchange,提问作者user9347364
相关产品推荐
相关产品推荐

