Подтвердить что ты не робот

Sed объединяет линии вместе

какая команда sed (или другой инструмент) объединяет строки вместе в файле, который не заканчивается символом "0"?

У меня будут строки вроде этого

412 | n | Лидерский строительный материал |||||||||| d | d | 20 || 0

которые нужно оставить в покое, и тогда у меня будут такие строки, как это (например, 3 строки, но только один конец w/0)

107 | n | Инструменты для связывания узлов ||||| Инструменты связывания узлов

||||| д | D | 0 || 0

которые необходимо объединить/объединить в одну строку

107 | n | Инструменты связывания узлов ||||| Инструменты связывания узлов ||||| d | d | 0 || 0

4b9b3361

Ответ 1

 sed ':a;/0$/{N;s/\n//;ba}'

В цикле (ветвь ba на метку :a), если текущая строка заканчивается на 0 (/0$/), добавьте следующую строку (N) и удалите внутреннюю новую строку (s/\n//).

AWK:

awk '{while(/0$/) { getline a; $0=$0 a; sub(/\n/,_) }; print}'

Perl:

perl -pe '$_.=<>,s/\n// while /0$/'

bash:

while read line; do 
    if [ ${line: -1:1} != "0" ] ; then 
        echo $line
    else echo -n $line
fi
done 

Ответ 2

awk также может быть коротким:

awk '!/0$/{printf $0}/0$/'

Тест:

kent$  cat t
#aasdfasdf
#asbbb0
#asf
#asdf0
#xxxxxx
#bar

kent$  awk '!/0$/{printf $0}/0$/' t
#aasdfasdf#asbbb0
#asf#asdf0
#xxxxxx#bar 

Ответ 3

если заканчивается 0 хранилищем, удалите новую строку.

sed '/0$/!N;s/\n//'

Ответ 4

Обычно криптографический однострочный Perl:

perl -pe 'BEGIN{$/="0\n"}s/\n//g;$_.=$/'

В качестве разделителя записей используется последовательность "0\n" (по вашему вопросу я предполагаю, что каждая строка должна заканчиваться нулем). Любая запись тогда не должна иметь внутренние новые строки, поэтому они удаляются, затем печатают строку, добавляя удаленные 0 и новую строку.

Другой вопрос на ваш вопрос будет состоять в том, чтобы каждая строка имела 17 разделенных друг от друга полей. Это не предполагает, что значение 17-го поля должно быть нулевым.

awk -F \| '
    NF == 17 {print; next}
    prev {print prev $0; prev = ""}
    {prev = $0}
'

Ответ 5

Оценка этого ответа вызывает удивление ;s (эта неожиданная улыбка смайликов на замену sed является преднамеренной), учитывая спецификации OP: присоединить строки.

Этот комментарий для отправки последний комментарий

", если этот случай проверяет, что @ninjalj отправил"

также предлагает проверить тот же ответ.

т. Проверьте с помощью sed ':a;/0$/{N;s/\n//;ba}' verbatim

sed ':a;/0$/{N;s/\n//;ba}'
 does
 no one
 ie. 0
 people,
 try
 nothing,

 ie. 0
 things,
 any more,
 ie. 0
 tests?

          (^D aka eot 004 ctrl-D ␄  ... bash generate via: echo ^V^D)

который не даст (выполнить тест;):

 does no one ie. 0
 people, try nothing, ie. 0
 things, any more, ie. 0
 tests?          (^D aka eot 004 ctrl-D ␄  ... bash generate via: echo ^V^D)

Для этого используйте:

sed 'H;${z;x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'

или

sed ':a;/0$/!{N;s/\n//;ba}'

не

sed ':a;/0$/{N;s/\n//;ba}'

Примечания:

sed 'H;${x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'

не использует ветвление и
идентичен:

sed '${H;z;x;s/\n//g;p;};/0$/!{H;d;};/0$/{H;z;x;s/\n//g;}'
  • H начинает все последовательности
  • d короткое замыкание далее script выполнение команды в текущей строке и запуск следующего цикла, поэтому селектора адресов, следующие за /0$/!, могут быть /0$/!!, поэтому селектор адресов /0$/{H;z;x;s/\n//g;} является избыточным и не нужен.
  • Если строка не заканчивается 0, сохраните ее в удержании

    /0$/!{H;d;}
  • Если строка заканчивается на 0, сохраните ее, а затем распечатайте флеш (двойное включение, то есть очищенное и выравнивание строк)
    /0$/{H;z;x;s/\n//g;}
  • NB ${H;z;x;s/\n//g;p;} использует команды /0$/ ... с дополнительным p для принудительной окончательной печати и с ненужным z (для пустого и reset пространства шаблонов, например s/.*//)