Мне нужна помощь в настройке правильного шаблона для 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 или более одного места, потому что вы исключаете строку №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
Ваша строка 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
Ваша строка 2 и 3 имеет верхний регистр P и требует ноль или более пробелов, поэтому укажите именно это:
$ grep '[[:blank:]]*Pattern' input.txt
Pattern to be recognized
Pattern to be recognized here also
Лично я бы рекомендовал расширить ваш шаблон с помощью чего-то другого, например '[[:blank:]]Pattern.*recognized'