Удаление новой строки после определенного текста через bash / awk / sed / perl - PullRequest
8 голосов
/ 15 декабря 2011

Я хотел бы удалить все символы новой строки, которые появляются после частичной строки, и заменить их пробелом.Скажем, например, мой sample.txt выглядит следующим образом

foo
bar bar bar bar some text

Я бы хотел, чтобы он был

foo    bar bar bar bar some text

Как мне сделать это через bash / awk / sed.Помогите.

Ответы [ 8 ]

12 голосов
/ 15 декабря 2011

В awk:

awk '/foo$/ { printf("%s\t", $0); next } 1'
7 голосов
/ 15 декабря 2011

Вот как:

cat input.txt | sed ':a;N;$!ba;s/foo\n/foo\t/g'

Подробнее о том, почему простой sed 's/foo\n/foo\t/g' здесь не работает: http://linuxtopia.org/online_books/linux_tool_guides/the_sed_faq/sedfaq5_009.html

4 голосов
/ 15 декабря 2011
perl -pe 's/(?<=foo)\n/\t/' input
3 голосов
/ 15 декабря 2011

Это может работать для вас:

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/{N;s/\n/\t/}'
foo     bar bar bar bar some text

На самом деле:

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/N;s/\n/\t/'
foo     bar bar bar bar some text

Последнее решение менее эффективно, но не намного!

2 голосов
/ 15 декабря 2011

Ммм.не уверен, что это соответствует вашим требованиям, но я бы сделал это в vim:

:g/^foo$/join

Или, если foo может быть где-нибудь в строке:

:g/foo$/join

Конечно, :%s/foo\n/foo\t/g тоже будет хорошо

2 голосов
/ 15 декабря 2011

Не все инструменты могут выполнять замену новой строки.Perl может:

cat file.txt | perl -p -e 's/\n/ /g'
1 голос
/ 15 декабря 2011
perl -pe 's/foo\n/foo\t/g' temp2.txt

ниже тест.

243> cat temp2.txt 
foo
bar bar bar bar some text 
pearl[ncm_o12.2_int_x86.@2].244> perl -pe 's/foo\n/foo\t/g' temp2.txt
foo     bar bar bar bar some text 
0 голосов
/ 22 июля 2015

Версия sed выглядит

#!/bin/sed -f
/foo/{
N
s/\n/\t/
}

Если это все, что вы хотите сделать в своей команде sed, вы можете упростить приведенное выше до одной строки:

sed -e '/foo/N;y/\n/\t/'  <sample.txt

Объяснение: N добавляет новую строку и следующую строку ввода; y/\n/\t заменяет все новые строки на вкладки, или s/\n/\t/ заменяет первую новую строку на вкладку.

Обратите внимание, что, поскольку sed ориентирован на строки, символы новой строки на входе рассматриваются как разделители строк, а не как часть какой-либо строки (это отличается, например, от Perl).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...