每当在文件中找到特定字符串时,我想合并两行。
输入示例:
{
id: 23281598
total: {
value: 3.0
}
isThin: false
raw: {
value: 6.0
}
}
total: {
value: 1.401326182E9
}
Pools: {
value: 8.98886247E8
期望的输出:
{
id: 23281598
total: { value: 3.0
}
isThin: false
raw: { value: 6.0
}
}
total: { value: 1.401326182E9
}
Pools: { value: 8.98886247E8
正如您所注意到的,每当我找到该模式时,value:
我都想将其与文件中的前一行组合起来。如果你删除每行中的前导空格,我就可以了。我需要awk
或sed
解决方案。输入文件中没有固定模式。包含的行value:
可能出现在任何地方,但不会连续出现。
使用Solaris 5.10。
答案1
正面:
LC_ALL=C sed -e '$!N;/value:/b1' -e 'P;D' -e:1 -e 's/\n[[:space:]]*/ /' <file
很简单:
$!N
:除了最后一行之外的每一行,读取下一行/value:/b1
:如果模式匹配,则转到名为的分支1
P;D
:如果模式不匹配,则打印当前行,从$!N
上面读取行开始新的循环。因此,如果有line1\nline2
,则打印line1
,用 开始新的循环line2
,$!N
使其成为line2\nline3
等等。:1
:定义名为的分支1
's/\n[[:space:]]*/ /'
:在分支中1
,将嵌入的换行符和前导空格替换为一个空格。
答案2
把事情简单化:
sed 'N;s/\n[[:space:]]*value:/ value:/;P;D'
执行一个N;P;D
循环,始终同时处理两行($!
顺便说一下,这里不需要)。在里面,用空格替换换行符,然后value:
用一个空格替换。就是这样。
答案3
sed
您也可以尝试使用
sed -e '/: {$/{N;s/\n//g}' -e 's/{.*v/{ v/g' file
解释:
/
启动条件: {$
如果行结尾为: {
/
结束条件{
启动操作组N;
将下面的行连接到匹配行s/\n//g
使替换\n
}
结束操作组
格式化输出可选
's/{.*v/{ v/g'
执行其他表达式,将{
&v
(空格)之间的所有内容替换为一个空格
据我了解,solaris 不支持-i
选项,因此您必须对输出进行重定向才能进行更改。
试一下