Как я могу сделать sed
строки соответствия фильтрам в соответствии с некоторым выражением, но игнорировать несовпадающие строки, вместо того, чтобы позволить им печатать?
В качестве реального примера я хочу запустить scalac
(компилятор Scala) для набора файлов и прочитать из его -verbose
вывода .class
созданные файлы. scalac -verbose
выводит кучу сообщений, но нас интересуют только сообщения формы [wrote some-class-name.class]
. В настоящее время я делаю следующее ( |&
это способ bash 4.0 передать stderr следующей программе):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Это позволит извлечь имена файлов из интересующих нас сообщений, но также позволит всем другим сообщениям проходить без изменений! Конечно, мы могли бы сделать это так:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
который работает, но очень похоже на решение реальной проблемы, а именно, как указать sed
игнорировать несовпадающие строки из ввода. Итак, как нам это сделать?
Ответы:
Другой способ с простым sed:
s///
- замена,t
без метки условно пропускает все последующие команды,d
удаляет строку.Нет необходимости в perl или grep.
(отредактировано по предложению Николаса Райли)
источник
tx
иd
использовать новую строку, а не точку с запятой, как я получалundefined label 'x;d;:x'
.sed -e 's/.../.../' -e 'tx' -e 'd' -e ':x'
(предложено в комментарии к аналогичному вопросу ).sed -e 's/.../.../' -e 't' -e 'd'
.-e
опции, поэтому вообще не упоминайте о ней.Если вы не хотите печатать строки, которые не совпадают, вы можете использовать комбинацию
-n
опция, которая сообщает sed не печататьp
флаг, который сообщает sed печатать то, что соответствуетЭто дает:
источник
echo foo | sed -n -e 's/foo/bar/p' -e 's/bar/oof/p'
будет выводить обеbar
иoof
в отдельных строках. Хотя сорт goto-label также не может обрабатывать несколько шаблонов, так как он удалит строку, если первый шаблон не совпадает.Используйте Perl:
источник
Рэпси поднял уместный вопрос о выражениях множественных замен.
{}
(разделенных точкой с запятой;
или новой строкой)Синтаксис:
Пример (подробнее см. Здесь документ ):
Код:
Результат:
источник
В замене нет необходимости.
источник