Шаблон 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