Почему sed печатает первую строку из файла, даже если это является отказавшим для нахождения соответствия группам

BSD является акронимом для Распределения программного обеспечения Беркли и не должен нести ". Вероятно, опечатка.

4
19.01.2014, 08:56
2 ответа

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

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

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

sed -n 's/REM[ \t]*GENRE[ \t]*"\(.*\)"/\1/p;q' your_file_here

Теперь этот сценарий распечатает первую строку, где замена была успешна и затем выход.

Обратите внимание, что Вам не были нужны две замены, только один достаточно.

Несвязанное примечание стороны

Никакая потребность в

cat your_file | grep 'foobar'

когда

grep 'foobar' your_file

сделал бы.


1Not всегда текущая входная строка: можно, например, добавить строки к пространству шаблона.

4
27.01.2020, 20:51

Если Вы не настроены против использования grep вместо этого, и Вы grep так, оказывается, реализация GNU, созданная с поддержкой PCRE, можно использовать ее средства PCRE (Perl Совместимые Регулярные выражения).

$ grep -oP '.*(?<=GENRE ").*(?=")' file.cue 
POP

Вышеупомянутое ищет строку ...GENRE " справа от .* сопровождаемый a " справа. Можно напрячься .* быть \w+ если они - все словесные символы, например.

Что было неправильным с sed?

Проблема - Вы, имел 2 поиска и замены в Вашем примере.

  • s/REMerror[ \t]*GENRE[ \t]*\(.*\)/\1/;
  • s/"\(.*\)"/\1/;

Первое ничему не соответствует и ничего не делает. Второй распознает двойное заключенное в кавычки слово "POP" и возвращает содержание, POP, формирование строки Вы видите,

REM GENRE POP

Можно убедить себя, что это - то, что продолжается путем вынимания первого поиска.

$ sed -e 's/"\(.*\)"/\1/;q' file.cue 
REM GENRE POP
3
27.01.2020, 20:51

Теги

Похожие вопросы