我需要从一个长行xml字符串中删除bash两个字符

时间:2016-02-02 15:45:46

标签: macos bash

我从stdin逐行读取字符串:

<xml version="1.0" encoding="UTF-8">\n<Datanode ....

我需要摆脱\n,它不是换行符,只是一个讨厌的序列。
我需要从管道中读取它,处理它并进一步管道。 通常我得到tr或cut的帮助,但是对于这个序列,我找不到方法,他们要么不删除它,要么从XML字符串中删除其他一些&#34; n&#34; n。

2 个答案:

答案 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兼容工具所需的更改。