我在Linux服务器上的文本文件中有如下记录 -
telephone = 1111
a=1
b=2
telephone = 2222
a=1
b=2
c=3
telephone = 3333
a=1
b=2
c=3
d=4
我需要它像这样 -
telephone = 1111, a=1, b=2
telephone = 2222, a=1, b=2, c=3
telephone = 3333, a=1, b=2, c=3, d=4
Grep或perl命令都可以,无论什么都可以帮助获得结果。
答案 0 :(得分:1)
假设您已在input.txt
文件中输入,请尝试以下操作:
perl -ne 'chomp; print /^telephone/ ? "\n$_" : ", $_" } { print "\n"' input.txt
编辑:在开始时阻止换行:
perl -ne 'chomp; print !/^telephone/ ? ", $_" : $. > 1 ? "\n$_" : "$_" } { print "\n"' input.txt
答案 1 :(得分:1)
使用perl one-liner:
perl -ne 'chomp; print !/^telephone/ ? ", " : $. > 1 ? "\n" : ""; print' file.txt
切换:
-n
:为输入文件中的每一行创建一个while(<>){...}
循环。 -e
:告诉perl
在命令行上执行代码。 答案 2 :(得分:0)
这也可以通过 awk :
方便地完成awk 'NR == 1 { buf = $0; next } /^telephone/ { print buf; buf = $0; next } { buf = buf ", " $0 } END {print buf}' input.txt
这种单行程可能会进一步缩短,但是......
编辑:是的,可以考虑awk从字符串构建布尔值的方式:
awk '/^telephone/ { if(buf) print buf; buf = $0; next } { buf = buf ", " $0 } END {print buf}' input.txt
EDIT2 :我添加了 sed 解决方案,不需要在ooga的解决方案中看到肢体扭曲:
sed -f myscript input.txt
其中myscript
如下:
#n
/^telephone/ {
x
s/\n/, /gp
g
n
}
H
$ {
g
s/\n/, /gp
}
答案 3 :(得分:0)
即使sed
也可以这样做。
sed '
$ {H; b output}
{
s/telephone/&/
t output
H
d
: output
x
s/\n/, /g
}
1d
' file