如何使用 jSoup 从 <pre> 字段中抓取文本并保持格式

How to use jSoup to grab text from <pre> field and keep formatting

我正在尝试简化由 ruby 脚本创建的日志,该脚本生成一个简单的日志文件,该文件由时间戳消息和 JSON 的混合组成,类似于:

[TIMESTAMP] MESSAGE
[
    {
        "JSON STUFF HERE"
    }
]
[TIMESTAMP]

问题是,如果您将日志文件另存为 .txt,它就没有换行符,这使得它几乎不可能用正则表达式输出。事实上,唯一保留换行符的时间是在浏览器 html 版本中,其中文本用 "pre" 标签包裹。我试过 awk 和 gsub 为:

gsub( / \[/, /\r\n\[/)

但仍然无法在文件中创建换行符。我想知道最简单的方法是加载它的格式,因为我需要自动化该过程。

这个问题中有很多不同的问题,我想说没有换行符(在 JSON 部分)实际上使正则表达式过程 更容易 (肯定是 sed),但也许我在这里误解了。

所以说,假设你有 python 可用,你可以使用它的 json module 至少为 JSON 做漂亮的打印:

python -mjson.tool logfile.json

有关缩进和换行符的选项,请参阅文档。

也许这足以让您入门。

你可以用awk换一种方式思考。 Awk 设计用于 "records"。虽然典型的记录分隔符是换行符,但可以使用标准 awk 或使用 GNU awk 的正则表达式将记录分隔符设置为任何有用的单个字符。

所以如果您的日志文件是这样的:

[TIMESTAMP] MESSAGE : Some message [ { "JSON STUFF HERE" } ] [TIMESTAMP] MESSAGE2 : Some other message [TIMESTAMP] ...

它有匹配的方括号,但没有换行符,你可以试试像这样的 awk:

awk 'BEGIN {FS="\]|:"; RS="\["} NF==3 && !/\{/ {print , , }' data

哪里

  • 字段分隔符设置为 FSBEGIN 块中设置为 ]:
  • 记录分隔符 RSBEGIN 块中设置为 [ 而不是使用默认的换行符
  • 如果在您的评论中有像 : 这样的消息分隔符,NF==3 是一个简单但不是很好的打印 TIMESTAMPSMESSAGES 的测试字段 </code> 和 <code></code> 假定为记录的其余部分。</li> <li>因为有效的 <code>JSON 可以包含那些相同的字段分隔符,所以还有一个测试 '{' 以排除短的 JSON 块。

作为单行的示例数据导致:

TIMESTAMP  MESSAGE   Some message 
TIMESTAMP  MESSAGE2   Some other message

现在显然,模式测试很弱,考虑到超过 MESSAGES 的数据可能有更多 :] 导致这些记录中更高的 NF 计数.在这种情况下,确保 匹配特定时间戳格式将提供更好的记录捕捉。