如果下一行不以数字开头,则删除新行

时间:2011-07-05 19:53:56

标签: file sed

我有一个类似

的文件
    1 test
    test

如何从中删除新行,以便最终输出:

1 test test

我已经尝试了一些sed但我无法使用它。

4 个答案:

答案 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