如何避免 sed 输出换行/回车?

如何避免 sed 输出换行/回车?

我多次分解单行,在每个步骤后重新组合它,但每个命令都会在输出中添加一个新行。

基本上,这些是命令:

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),从几分钟到等待太久。

相关内容