шаблон 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 Если это не подходящий форум, пожалуйста, направляйте меня соответственно.

1
задан 19 June 2017 в 19:08

4 ответа

То, что я получаю, - это то, что вы не хотите ни одного ведущего места вообще, например, строки # 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
1
ответ дан 18 July 2018 в 11:24

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

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

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

1
ответ дан 18 July 2018 в 11:24

То, что я получаю, - это то, что вы не хотите ни одного ведущего места вообще, например, строки # 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
1
ответ дан 24 July 2018 в 19:47

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

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

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

1
ответ дан 24 July 2018 в 19:47
  • 1
    Благодарю. Работает. Чтобы позаботиться о прописных и строчных строках, я использую grep -i. Я действительно отсутствовал * между [[:blank:]] и pattern в моей первой попытке. Но я действительно хотел grep '^[[:blank:]]*Pattern' input.txt, иначе он также возвращает 1. – Mike V.D.C. 19 June 2017 в 19:05
  • 2
    @ MikeV.D.C. ну, если ваш вход совпадает с вашим примером, у вас есть ведущие пробелы в каждой строке. Таким образом, с grep -i это не совсем работает. Я думаю, было бы намного лучше, если бы мы знали фактические данные и образец, которые вы пытаетесь сделать – Sergiy Kolodyazhnyy 19 June 2017 в 19:07
  • 3
    Цифры в выборке приведены только для справки. Может быть, я должен был упомянуть об этом в ОП. – Mike V.D.C. 19 June 2017 в 19:10
  • 4
    Ах, так линии 1 и 4 на самом деле не имеют ведущего пространства? – Sergiy Kolodyazhnyy 19 June 2017 в 19:11
  • 5
    Строка 1 не имеет, но строка 4 имеет один. – Mike V.D.C. 19 June 2017 в 19:12

Другие вопросы по тегам:

Похожие вопросы: