我多次分解单行,在每个步骤后重新组合它,但每个命令都会在输出中添加一个新行。
基本上,这些是命令:
h
s#(^.*?)(\[\{.*$)#\1#p
g
s#(^.*?)(\[\{.*?\}\])(.*)$#echo \2 | jq --sort-keys --compact-output#ep
g
s#(^.*?\}\])(.*)$#\2#p
z
但是原始行在 sed 之后产生三行,因为每行在/p
内容后添加一个换行符:我怎样才能避免这种情况?输入中的一行应导致输出中的一行。
相反/p
,我还尝试将s
命令结果写入带有/w filename
标志的文件,然后用命令读取它r filename
,但文件内容直接添加到输出中,给出相同的结果。
是/p
因为我尝试向 sed 添加 -n 命令行参数。
添加一些上下文:我正在解析日志 HTTP POST 请求,这些请求由时间戳、请求 URI、请求 JSON 正文和请求标头组成,我正在尝试使用杰克统一排序 JSON 属性。
答案1
如果我正确理解了您的问题,您可以使用tr -d '\n'
删除换行符,包括sed
.
答案2
我设法通过以下脚本获得了我想要的结果:
h
# Extract the first part of the input line and store it as-is
s#(^.*?)(\[\{.*$)#\1#
H
g
# (1)
s#$(\n|.)*\'##m
# Extract the second part of the input line and process it with an external command
s#(^.*?)(\[\{.*?\}\])(.*)$#echo \2 | jq --sort-keys --compact-output#e
H
g
# (1)
s#$(\n|.)*\'##m
# Extract the third (and final) part of the input line and store it as-is
s#(^.*?\}\])(.*)$#\2#m
H
g
# (2)
s#^.*$\n##m
# (3)
s#\n##mg
我基本上将原始输入保留在保留空间,首先复制它(使用h
),然后累积部分处理结果并将它们附加到保留空间(和H
)。因此,当我更换模式空间与保留空间(使用g
)我需要删除那些额外的组件(使用命令(1))。
在处理结束时,我删除第一行 - 即原始输入行 - (使用命令(2))并删除先前使用命令添加的所有换行符H
(使用命令(3)),有效地重新组合一个打印之前的行模式空间来输出。
注意:我很快发现 shell 命令调用是一个真正的阻止程序,它会减慢处理单个文件的速度(处理过程会执行除此之外的几个步骤sed
),从几分钟到等待太久。