我从stdin逐行读取字符串:
<xml version="1.0" encoding="UTF-8">\n<Datanode ....
我需要摆脱\n
,它不是换行符,只是一个讨厌的序列。
我需要从管道中读取它,处理它并进一步管道。
通常我得到tr或cut的帮助,但是对于这个序列,我找不到方法,他们要么不删除它,要么从XML字符串中删除其他一些&#34; n&#34; n。
答案 0 :(得分:1)
所以你想要删除由'\'后跟'n'确定的字符串?
这样的事情应该有效:
... | sed 's/\\n//' | ...
或者如果你想删除多个序列:
... | sed 's/\\n//g' | ...
并且,如果要锚定要删除的序列:
... | sed 's/>\\n</></' | ...
<强>更新强>
如果您不想删除序列'\''n'但将替换为真正的新行(我确实注意到您的标记< strong> osx ),您可能希望使用以下内容:
... | sed -e 's/\\n/\'$'\n/' | ...
答案 1 :(得分:0)
我假设您的文档因为在根目录之外包含文本节点而不是有效的XML,这可以解释为什么您不能使用传统的以XML为中心的工具。
要真正仅使用bash,并且以防止损坏文件的方式执行此操作(仅针对确切的标题文本执行替换 < em>仅在的第一行):
correct_xml_header() {
local bad_header correct_header content
bad_header='<xml version="1.0" encoding="UTF-8">\n'
correct_header='<?xml version="1.0" encoding="UTF-8"?>'
IFS= read -r -d '' content
if [[ $content = "$bad_header"* ]]; then
content=${correct_header}${content#"$bad_header"}
fi
printf '%s' "$content"
}
然后您可以通过此功能:
generate_bad_xml | correct_xml_header | consume_good_xml
如果您想添加文字换行符,请将$'\n'
添加到correct_header
定义的末尾,如下所示:
correct_header='<?xml version="1.0" encoding="UTF-8"?>'$'\n'
请注意,我还将<xml ...>
更改为<?xml ...?>
,这是使用此工具的输出正确解析XML兼容工具所需的更改。