Почему это регулярное выражение не работает?

Регулярное выражение:

^ *x *\=.*$   

означает «сопоставить литерал x, которому предшествует произвольное количество пробелов, за которым следует произвольное количество пробелов, затем знак равенства, а затем что-либо до конца строки». Sed вызывался как:

sed -r -e 's|^ *x *\=.*$||g' file

Однако он не находит ни одного совпадения, хотя должен. Что не так с регулярным выражением?

Всем: спасибо за ответы и усилия! Похоже, проблема заключалась во вкладках, присутствующих во входном файле, которые НЕ соответствуют спецификатору пробела « ». Однако решение с \s работает вне зависимости от наличия вкладок!


person Community    schedule 24.08.2009    source источник
comment
Используйте четыре пробела для форматирования кода или используйте backticks для моноширинного шрифта.   -  person T.J. Crowder    schedule 24.08.2009


Ответы (3)


^\s*x\s*=.*$

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

Кстати: теги Regex действительно должны иметь три требования:

какая входная строка, какая выходная строка и ваша платформа/язык.

person iElectric    schedule 24.08.2009
comment
Я думаю, вы хотите, чтобы это было ^\s*x\s*=.*$ (чтобы охватить литерал x, которому предшествует произвольное количество пробелов). - person Fredrik Mörk; 24.08.2009
comment
проголосовал только за эту строку «какая входная строка, какая выходная строка и ваша платформа/язык». - person paan; 24.08.2009

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

sed -re '/^ *x *=.*$/!d' file
  • "/^ *x *=.*$/" выбирает каждую строку, соответствующую шаблону.
  • "!" отрицает результат.
  • "d" удаляет строку.

sed по умолчанию печатает все строки, если не указано иное. Это эффективно печатает строки, соответствующие шаблону.

Один из альтернативных способов написания:

sed -rne '/^ *x *=.*$/p' file
  • «/^ *x *=.*$/» выбирает каждую строку, соответствующую шаблону.
  • "p" печатает строку.

Разница здесь в том, что я использовал переключатель «-n», чтобы отключить автоматическую печать строк, и вместо этого печатать только те строки, которые я выбрал.

Вы также можете использовать "grep" для этой задачи:

grep -E '^ *x *=.*$' file
person Markus Jarderot    schedule 24.08.2009

или, может быть, '^[ ]*x[ ]*='. Это немного более совместимо, но не будет соответствовать вкладкам или тому подобному. И если вам не нужны группы, зачем беспокоиться об остальной части линии?

person Blitz    schedule 24.08.2009