我有一个类似
的文件1 test test
如何从中删除新行,以便最终输出:
1 test test
我已经尝试了一些sed但我无法使用它。
答案 0 :(得分:5)
这应该可以解决问题:
sed -n '$!{ 1{x;d}; H}; ${ H;x;s|\n\([^0-9]\)| \1|g;p}' inputfile
<强>输入:强>
1 test1
test1
2 test2
test2
test2
3 test3
4 test4
<强>输出:强>
1 test1 test1
2 test2 test2 test2
3 test3
4 test4
答案 1 :(得分:3)
如果它以数字开头(第一行除外),你可以更聪明一点并在该行之前打印一个新行;
awk 'BEGIN{ORS="";} NR==1 { print; next; } /^[[:digit:]]/ { print "\n"; print; next; } { print; }'
awk脚本:
BEGIN { ORS=""; } # default: no newline between output records
NR==1 { print; next; } # first line: print
/^[[:digit:]]/ { print "\n"; print; next; } # if starts with a digit: print newline before
{print;} # other lines (next; has not been called yet)
答案 2 :(得分:0)
用sed完成这个很简单。考虑下面的文件
$ cat numbered
1 abc
def
ghi
2 jkl
mno
3 pqr
4 stu
vxw
命令sed '/^[0-9]/{N; s/\n/ /;}' numbered
将起到作用:
$ sed '/^[0-9]/{N; s/\n/ /;}' numbered
1 abc def
ghi
2 jkl mno
3 pqr 4 stu
vxw
工作原理:首先,它验证当前行是否以数字开头:
/^[0-9]/
/^[0-9]/
是address,只匹配以数字开头的行。如果某条线匹配它,将执行地址后面的命令。
在这种情况下,此命令是{
,它会打开一个功能列表。函数列表将聚合两个或多个命令,就好像它们只有一个命令一样。在这种情况下,我们在函数列表中有两个命令。第一个是N
命令:
N
此命令将换行符和下一行附加到模式空间。在当前周期之后将不再考虑下一行。下一个命令是s///
,它用空格替换换行符:
s/\n/ /
因此,N
附加的换行符将替换为空格。然后,我们只需要用}
关闭函数列表。结果将是:
/^[0-9]/{
N
s/\n/ /
}
由于我将所有命令放在一行中以简洁起见,因此函数列表中的命令应以分号分隔:
/^[0-9]/{N;s/\n/ /;}
请注意,如果以数字开头的行跟在以数字开头的另一行之后,则以下行将连接到前一行,该命令将应用于该行。
答案 3 :(得分:-1)
使用'sed'的解决方案:
输入文件(infile):
1 test
test
2 two
3 three
4 four
five
six
7 seven
eight
9 nine
'Sed'程序(script.sed):
/[0-9]\+/ {
: a
N
/\n[0-9]\+/ {
P
s/.*\n//
}
t a
}
y/\n/ /
执行:
$ sed -f script.sed infile
输出:
1 test test
2 two
3 three
4 four five
six
7 seven eight
9 nine