Sed 命令在 sun solaris 机器上不起作用
Sed command not working in sun solaris machine
我有一个 xml 文件,我正在其中搜索以下模式。
<ServiceConfig Id="554">
<Comment>ECS_OCS_V1_0.0.0.7.32251@3gpp.org</Comment>
<MaxCost>0.000000</MaxCost>
<MaxCostLocalCurrency>true</MaxCostLocalCurrency>
<Atomic>false</Atomic>
<TariffSwitchHandling>external</TariffSwitchHandling>
<CdrAtTollFreeService>false</CdrAtTollFreeService>
<BonusDuringSession>false</BonusDuringSession>
<UserMessagesStartOfSession>true</UserMessagesStartOfSession>
<UserMessagesDuringSession>true</UserMessagesDuringSession>
<UseAccumulatorStartValues>false</UseAccumulatorStartValues>
<ValidityTime Factor="1">120</ValidityTime>
<Volume>
<Total PreferredFactor="1024" Preferred="500" MinimumFactor="1000000" Minimum="0"></Total>
</Volume>
<VolumeQuotaThreshold Factor="1">0</VolumeQuotaThreshold>
<SendQuotaHoldingTime>false</SendQuotaHoldingTime>
<QuotaHoldingTime Factor="1">0</QuotaHoldingTime>
<SendQuotaConsumptionTime>false</SendQuotaConsumptionTime>
<QuotaConsumptionTime Factor="1">0</QuotaConsumptionTime>
</ServiceConfig>
块的打开和关闭标记为 "ServiceConfig" & 其中注释标记具有 "ECS_OCS_V1_0.0.0.7" 字符串。为此,我使用了下面的 sed 命令。
sed -n '/<ServiceConfig Id=/ { :a /<\/ServiceConfig/! { N; ba; }; /<Comment>ECS_OCS_V1_0.0.0.7./ { p; b; }; }' ServiceConfig.xml
此命令在 linux 系统上运行良好,但在 sunOS 上失败并出现以下错误。
Label too long: /<ServiceConfig Id=/ { :a /<\/ServiceConfig/! { N; ba; }; /<Comment>ECS_OCS_V1_0.0.0.7./ { p; b; }; }
我无法理解这个问题的原因。
在 solaris 上(通常默认设置 and/of sed 版本),;
不像在 GNU sed 上那样被解释为新行,使用真正的新行,特别是标签和跳转
sed -n '/<ServiceConfig Id=/ {
:a
/<\/ServiceConfig/ !{
N
ba
}
/<Comment>ECS_OCS_V1_0.0.0.7./ {
p
b
}
}' ServiceConfig.xml
或使用多个-e
动作参数
sed -n -e '/<ServiceConfig Id=/ {' -e ':a' -e '/<\/ServiceConfig/ !{ N; ba' -e '}; /<Comment>ECS_OCS_V1_0.0.0.7./ { p; b' -e'}' -e '}' ServiceConfig.xml
我有一个 xml 文件,我正在其中搜索以下模式。
<ServiceConfig Id="554">
<Comment>ECS_OCS_V1_0.0.0.7.32251@3gpp.org</Comment>
<MaxCost>0.000000</MaxCost>
<MaxCostLocalCurrency>true</MaxCostLocalCurrency>
<Atomic>false</Atomic>
<TariffSwitchHandling>external</TariffSwitchHandling>
<CdrAtTollFreeService>false</CdrAtTollFreeService>
<BonusDuringSession>false</BonusDuringSession>
<UserMessagesStartOfSession>true</UserMessagesStartOfSession>
<UserMessagesDuringSession>true</UserMessagesDuringSession>
<UseAccumulatorStartValues>false</UseAccumulatorStartValues>
<ValidityTime Factor="1">120</ValidityTime>
<Volume>
<Total PreferredFactor="1024" Preferred="500" MinimumFactor="1000000" Minimum="0"></Total>
</Volume>
<VolumeQuotaThreshold Factor="1">0</VolumeQuotaThreshold>
<SendQuotaHoldingTime>false</SendQuotaHoldingTime>
<QuotaHoldingTime Factor="1">0</QuotaHoldingTime>
<SendQuotaConsumptionTime>false</SendQuotaConsumptionTime>
<QuotaConsumptionTime Factor="1">0</QuotaConsumptionTime>
</ServiceConfig>
块的打开和关闭标记为 "ServiceConfig" & 其中注释标记具有 "ECS_OCS_V1_0.0.0.7" 字符串。为此,我使用了下面的 sed 命令。
sed -n '/<ServiceConfig Id=/ { :a /<\/ServiceConfig/! { N; ba; }; /<Comment>ECS_OCS_V1_0.0.0.7./ { p; b; }; }' ServiceConfig.xml
此命令在 linux 系统上运行良好,但在 sunOS 上失败并出现以下错误。
Label too long: /<ServiceConfig Id=/ { :a /<\/ServiceConfig/! { N; ba; }; /<Comment>ECS_OCS_V1_0.0.0.7./ { p; b; }; }
我无法理解这个问题的原因。
在 solaris 上(通常默认设置 and/of sed 版本),;
不像在 GNU sed 上那样被解释为新行,使用真正的新行,特别是标签和跳转
sed -n '/<ServiceConfig Id=/ {
:a
/<\/ServiceConfig/ !{
N
ba
}
/<Comment>ECS_OCS_V1_0.0.0.7./ {
p
b
}
}' ServiceConfig.xml
或使用多个-e
动作参数
sed -n -e '/<ServiceConfig Id=/ {' -e ':a' -e '/<\/ServiceConfig/ !{ N; ba' -e '}; /<Comment>ECS_OCS_V1_0.0.0.7./ { p; b' -e'}' -e '}' ServiceConfig.xml