удалить новую строку, если следующая строка не начинается с числа - PullRequest
4 голосов
/ 05 июля 2011

У меня есть файл, похожий на

    1 test
    test

Как я могу удалить новую строку, чтобы конечный результат стал:

1 test test

Я уже попробовал sed, но не смог заставить его работать.

Ответы [ 4 ]

5 голосов
/ 07 июля 2011

Это должно помочь:

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
3 голосов
/ 06 июля 2011

Вы можете быть немного умнее и печатать новую строку перед строкой, если она начинается с цифры (кроме первой строки);

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)
0 голосов
/ 07 июля 2011

Это довольно просто сделать с помощью 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]/ является адресом и соответствует только строкам, начинающимся с цифры.Если какая-либо строка соответствует ей, команда, следующая за адресом, будет выполнена.

В этом случае это команда {, которая открывает список функций.Список функций объединит две или более команд, как если бы они были только одной.В этом случае у нас есть две команды в списке функций.Первая - это команда N:

N

Эта команда добавляет новую строку и следующую строку в пространство шаблона.Следующая строка больше не будет рассматриваться после текущего цикла.Следующая команда - s///, которая заменяет символы новой строки пробелом:

s/\n/ /

Таким образом, символ новой строки, добавленный N, будет заменен пробелом.Затем нам нужно просто закрыть список функций с помощью }.Результат будет:

/^[0-9]/{
    N
    s/\n/ /
}

Поскольку для краткости я поместил все команды в одну строку, команды внутри списка функций должны быть разделены точками с запятой:

/^[0-9]/{N;s/\n/ /;}

Обратите внимание, чтоесли строка, начинающаяся с цифры, следует за другой строкой, начинающейся с цифры, следующая строка будет присоединена к предыдущей и к ней будет применена команда.

0 голосов
/ 06 июля 2011

Решение с использованием '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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...