Sed объединяет линии вместе
какая команда sed (или другой инструмент) объединяет строки вместе в файле, который не заканчивается символом "0"?
У меня будут строки вроде этого
412 | n | Лидерский строительный материал |||||||||| d | d | 20 || 0
которые нужно оставить в покое, и тогда у меня будут такие строки, как это (например, 3 строки, но только один конец w/0)
107 | n | Инструменты для связывания узлов ||||| Инструменты связывания узлов
||||| д | D | 0 || 0
которые необходимо объединить/объединить в одну строку
107 | n | Инструменты связывания узлов ||||| Инструменты связывания узлов ||||| d | d | 0 || 0
Ответы
Ответ 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/.*//)