Я нуждаюсь в некоторой помощи в установке корректного шаблона для 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.
- Mike P.S., Если это не подходящий форум, то ведет меня соответственно.
Ваша строка 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