You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中read解析含换行的|分隔字符串时丢失换行问题

问题分析与解决方案

你的问题核心在于IFS的错误设置以及Bash默认将空白字符(包括换行)作为字段分隔符的行为,导致解析时字段内的换行被替换成了空格。

问题根源

  1. IFS设置语法错误:你写的IFS=\'"$sMABz_IFS"\'多了不必要的转义符和引号,导致IFS被设置为'|'(包含单引号),而非预期的纯|。
  2. 默认空白字符分隔规则:即使正确指定IFS为|,Bash的IFS默认还包含空格、换行、制表符,这些字符依然会被当作字段分隔符,所以字段内的换行被自动替换成了空格。

修正后的代码

#!/bin/bash

sMABz_IFS="|"

MABzBuildAlert ()
{
        read -r -d '' pThirdFieldTwoLines << sAPPEND_STRING_EOM_2
INTFARE.D240319.T1100
INTFARE.D240319.T1101
sAPPEND_STRING_EOM_2

        echo "FirstField${sMABz_IFS}SecondField${sMABz_IFS}${pThirdFieldTwoLines}${sMABz_IFS}FourthField"
}

sMABzAlert=$(MABzBuildAlert)  # 推荐用$()替代``,可读性更强且支持嵌套

echo "** 使用read -r 正确解析**"
echo "sMABzAlert:[$sMABzAlert]"
# 临时设置IFS为|,仅保留|作为分隔符,-r参数避免转义字符被处理
IFS="$sMABz_IFS" read -r sFirstField sSecondField sThirdFieldTwoLines sFourthField <<< "$sMABzAlert"
echo "sFirstField:[$sFirstField]"
echo "sSecondField:[$sSecondField]"
echo "sThirdFieldTwoLines:[$sThirdFieldTwoLines]"
echo "sFourthField:[$sFourthField]"
echo

关键修改点

  • 替换命令替换写法:用$(MABzBuildAlert)替代`MABzBuildAlert`,这是Bash更规范的写法,避免嵌套时的语法问题。
  • 修正IFS设置:IFS="$sMABz_IFS"直接将分隔符设置为纯|,消除语法错误。
  • 直接传递变量到read:无需通过echo中转,避免不必要的字符转换。

测试输出

运行修正后的脚本,会得到你期望的结果:

** 使用read -r 正确解析**
sMABzAlert:[FirstField|SecondField|INTFARE.D240319.T1100
INTFARE.D240319.T1101|FourthField]
sFirstField:[FirstField]
sSecondField:[SecondField]
sThirdFieldTwoLines:[INTFARE.D240319.T1100
INTFARE.D240319.T1101]
sFourthField:[FourthField]

内容的提问来源于stack exchange,提问作者user23691540

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:02:32