имея регулярное выражение, заменяющее строки, сохраняете символы новой строки? - PullRequest
1 голос
/ 26 января 2011

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

$ echo -e 'a\nb\nc\nd\ne\nf\ng' | tr -d '\n' | grep -or 'b.*f'
bcdef

или

$ echo -e 'a\nb\nc\nd\ne\nf\ng' | tr -d '\n' | sed -r 's|b(.*)f|y\1z|'
aycdezg

Я хотел бы использовать grep или sed, потому что я хотел бы знать, что люди сделали бы до awk или perl..

неужели бы?был. * недоступен?Разве у них нет другого эквивалента?

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

Ответы [ 3 ]

1 голос
/ 26 января 2011

Это должно сделать то, что вы ищете:

$ echo -e 'a\nb\nc\nd\ne\nf\ng' | sed ':a;$s/b\([^f]*\)f/y\1z/;N;ba'
a
y
c
d
e
z
g

Накапливает все строк, затем выполняет замену. Это выглядит для первого "F". Если вы хотите, чтобы он искал последнюю букву "f", измените [^f] на ..

Обратите внимание, что для этого могут использоваться функции, добавленные к sed после того, как стали доступны AWK или Perl (AWK был около долгое время ).

Изменить:

Для многострочного grep требуется лишь небольшая модификация:

$ echo -e 'a\nb\nc\nd\ne\nf\ng' | sed ':a;$s/^[^b]*\(b[^f]*f\)[^f]*$/\1/;N;ba'
b
c
d
e
f
1 голос
/ 26 января 2011

sed может совпадать между строками с помощью команды N.Например, следующая команда sed заменит bar, затем newline, затем foo на ###:

$ echo -e "foo\nbar\nbaz\nqux" | sed 'N;s/bar\nbaz/###/;P;D'
foo
###
qux
  1. Команда N добавит следующуюстрока ввода в текущее пространство шаблона, разделенное встроенной новой строкой (\n)
  2. Команда P напечатает текущее пространство шаблона вплоть до первой встроенной новой строки.
  3. Команда D удалит вплоть до первой встроенной новой строки в пространстве шаблона.Он также запустит следующий цикл, но пропустит чтение из входных данных, если в пространстве образца все еще есть данные.

Используя эти 3 команды, вы можете по существу выполнить любую команду sзамена просматривая N-строк.

Редактировать

Если ваш вопрос заключается в том, как я могу устранить необходимость в tr в двух приведенных выше примерах и просто использовать sed, тогда вот вам:

$ echo -e 'a\nb\nc\nd\ne\nf\ng' | sed ':a;N;$!ba;s/\n//g;y/ag/yz/'
ybcdefz
0 голосов
/ 26 января 2011

Проверенные на помощь инструменты.

echo -e "foo\nbar\nbaz\nqux" | perl -lpe 'BEGIN{$/=""}s/foo\nbar/###/'
...