как сказать sed "точка соответствует новой строке" - PullRequest
8 голосов
/ 24 декабря 2011

Я не могу понять, как сказать sed точка соответствует новой строке :

echo -e "one\ntwo\nthree" | sed 's/one.*two/one/m'

Я ожидаю получить:

один
три

вместо этого я получаю оригинал:

один
два
три

Ответы [ 5 ]

4 голосов
/ 24 декабря 2011

sed это линейный инструмент. Я не думаю, что это вариант.
Вы можете использовать h/H (удерживать), g/G (получить).

$ echo -e 'one\ntwo\nthree' | sed -n '1h;1!H;${g;s/one.*two/one/p}'
one
three

Может быть, вам стоит попробовать vim

:%s/one\_.*two/one/g
3 голосов
/ 24 декабря 2011

Вы можете использовать python следующим образом:

$ echo -e "one\ntwo\nthree" | python -c 'import re, sys; s=sys.stdin.read(); s=re.sub("(?s)one.*two", "one", s); print s,'
one
three
$

Это считывает стандартный ввод всего питона (sys.stdin.read()), а затем заменяет "один" на "один. * Два" на точка соответствует всем включенным настройкам (используя (?s) в начале регулярное выражение), а затем печатает измененную строку (конечная запятая в печати используется для предотвращения добавления дополнительной строки в печать).

1 голос
/ 24 декабря 2011

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

<<<$'one\ntwo\nthree' sed '/two/d'

или

<<<$'one\ntwo\nthree' sed '2d'

или

<<<$'one\ntwo\nthree' sed 'n;d'

или

<<<$'one\ntwo\nthree' sed 'N;N;s/two.//'

Sed соответствует всем символам (включая \n), используя точку ., но обычно она уже удаляет \n как часть цикла, поэтому дольше присутствует в шаблонном пространстве для сопоставления.

Только определенные команды (N, H и G) сохраняют новые строки в образце / области удержания.

  1. N добавляет новую строку к пробелу шаблона, а затем добавляет следующую строку.
  2. H делает то же самое, за исключением того, что действует на пространство удержания.
  3. G добавляет новую строку в пространство образца, а затем добавляет все, что находится в области удержания.

Пространство для хранения пусто до тех пор, пока вы не поместите в него что-то так:

sed G file

вставит пустую строку после каждой строки.

sed 'G;G' file

вставит 2 пустые строки и т. Д. И т. Д.

0 голосов
/ 08 января 2019

Ниже обсуждение основано на Gnu sed.

sed работает построчно. Так что невозможно сказать это точка соответствия новой строки . Однако есть некоторые приемы, которые могут это реализовать. Вы можете использовать структуру цикла (вид), чтобы поместить весь текст в пространство шаблона, а затем выполнить операцию.

Чтобы поместить все в пространство шаблона, используйте:

:a;N;$!ba;

Для косвенного определения "совпадения точек" вы используете:

(\n|.)

Итак, результат:

root@u1804:~# echo -e "one\ntwo\nthree" | sed -r ':a;N;$!ba;s/one(\n|.)*two/one/'
one
three
root@u1804:~#

Обратите внимание, что в этом случае (\n|.) соответствует символу новой строки и всем символам. Смотрите пример ниже:

root@u1804:~# echo -e "oneXXXXXX\nXXXXXXtwo\nthree" | sed -r ':a;N;$!ba;s/one(\n|.)*two/one/'
one
three
root@u1804:~#
0 голосов
/ 18 октября 2013

Как насчет двух вызовов sed:
(сначала избавьтесь от 'two', затем избавьтесь от пустой строки)

$ echo -e 'one\ntwo\nthree' | sed 's/two//' | sed '/^$/d'
one
three

На самом деле, я предпочитаю Perl для одно-лайнеры над Python:

$ echo -e 'one\ntwo\nthree' | perl -pe 's/two\n//'
one
three
...