如何使用 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
哪里
- 字段分隔符设置为
FS
在 BEGIN
块中设置为 ]
或 :
- 记录分隔符
RS
在 BEGIN
块中设置为 [
而不是使用默认的换行符
- 如果在您的评论中有像
:
这样的消息分隔符,NF==3
是一个简单但不是很好的打印 TIMESTAMPS
和 MESSAGES
的测试字段 </code> 和 <code>
。 </code> 假定为记录的其余部分。</li>
<li>因为有效的 <code>JSON
可以包含那些相同的字段分隔符,所以还有一个测试 '{' 以排除短的 JSON
块。
作为单行的示例数据导致:
TIMESTAMP MESSAGE Some message
TIMESTAMP MESSAGE2 Some other message
现在显然,模式测试很弱,考虑到超过 MESSAGES
的数据可能有更多 :
或 ]
导致这些记录中更高的 NF
计数.在这种情况下,确保
匹配特定时间戳格式将提供更好的记录捕捉。
我正在尝试简化由 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
哪里
- 字段分隔符设置为
FS
在BEGIN
块中设置为]
或:
- 记录分隔符
RS
在BEGIN
块中设置为[
而不是使用默认的换行符 - 如果在您的评论中有像
:
这样的消息分隔符,NF==3
是一个简单但不是很好的打印TIMESTAMPS
和MESSAGES
的测试字段</code> 和 <code>
。</code> 假定为记录的其余部分。</li> <li>因为有效的 <code>JSON
可以包含那些相同的字段分隔符,所以还有一个测试 '{' 以排除短的JSON
块。
作为单行的示例数据导致:
TIMESTAMP MESSAGE Some message
TIMESTAMP MESSAGE2 Some other message
现在显然,模式测试很弱,考虑到超过 MESSAGES
的数据可能有更多 :
或 ]
导致这些记录中更高的 NF
计数.在这种情况下,确保 匹配特定时间戳格式将提供更好的记录捕捉。