Шаблон grep с начальными пробелами

Мне нужна помощь в настройке правильного шаблона для grep. Мне нужно найти все случаи pattern где строка может иметь начальные пробелы. Например: в следующем файле:

 1. No pattern recognized.
 2. Pattern to be recognized
 3.          Pattern to be recognized here also
 4.  pattern with only one leading space 

Я хотел бы grep только строки 2,3 и 4. Номера строк только для справки.

До сих пор я пробовал следующее:

grep -i '^ [[:blank:]]pattern', но возвращает только строку 4.

grep -i '[[:blank:]]pattern' возвращает 1,3 и 4.

grep -i '^[[:blank:]]pattern' возвращает 1,3 и 4.

- Майк PS Если это не тот форум, то, пожалуйста, направьте меня соответствующим образом.

2 ответа

Ваша строка 2 и 3 имеет верхний регистр P и требует нуля или более пробелов, поэтому укажите точно, что:

$ grep '[[:blank:]]*Pattern'  input.txt                                  
 Pattern to be recognized
         Pattern to be recognized here also

Лично я бы рекомендовал расширить ваш паттерн чем-то другим, например, '[[:blank:]]Pattern.*recognized'

То, что я получаю, это то, что вы хотите, чтобы либо не было начального пробела вообще, например строки № 2, либо более одного пробела, потому что вы исключаете строку № 4, в которой есть один пробел.

поэтому я предлагаю:

egrep -i '^\s*pattern' file.txt | grep -v '^\spattern'

или с помощью одного awk:

awk 'tolower($0) ~ /^\s*pattern/ && !/^\spattern/ ' file.txt
  • \s как пространство вы можете изменить его с blank если ты хочешь.
  • egrep -i '^\s*pattern' file.txt сначала мы получаем все строки, начинающиеся с или без пробелов, следующих за шаблоном.
  • grep -v '^\spattern': тогда мы исключаем те, которые содержат ровно один ведущий пробел.

Приведенный выше пример работает с файлом без нумерации, если ваш файл содержит первые цифры, используйте этот:

egrep -i '\s*pattern' file.txt | grep -v '\spattern'

или для awk:

awk 'tolower($0) ~ /\s*pattern/ && !/\spattern/ ' file.txt
Другие вопросы по тегам