Проблема с регулярным выражением с использованием grep - PullRequest
0 голосов
/ 06 октября 2009

У меня есть несколько текстовых файлов с именами, номерами телефонов и кодами регионов. Одна комбинация на линию.

Синтаксис всегда такой: «Имя, код региона»
С любым количеством пробелов между 3 переменными.

Что я хочу сделать, это поиск конкретных кодов регионов, например, 23 или 493, например. Проблема в том, что эти числа могут появляться и в более длинных числах, что может привести к возврату, который не должен был быть возвращен.

Я думал о такой команде:
grep '04' numbers.txt

Но если я сделаю это, строка, содержащая 04 в номере, но не код региона, также будет отображаться в результате ... что не правильно.

Ответы [ 5 ]

6 голосов
/ 06 октября 2009

Я уверен, что вы собираетесь погрузиться в умные регулярные выражения, но я думаю, что в этом случае все, что вам нужно сделать, это включить один из пробелов с каждой стороны вашего кода региона в grep.

grep ' 04 ' numbers.txt

2 голосов
/ 06 октября 2009

Я бы сделал:

awk '$2 == "04"' < numbers.txt

и с grep:

grep -e '^[^ ]*[ ]*04[ ]*[^ ]*$' numbers.txt
1 голос
/ 06 октября 2009

Если вы хотите использовать только коды регионов, вы должны использовать:

grep "[[:space:]]04[[:space:]]"

таким образом он будет искать только цифры в среднем столбце, в то время как начало или конец строк считаются переносом слов.

Вы даже можете сделать:

function search_region_codes {
   grep "[[:space:]]${1}[[:space:]]" FILE
}

замена ФАЙЛА именем вашего файла,

и используйте

search_region_codes 04

или даже

function search_region_codes {
   grep "[[:space:]]${1}[[:space:]]" $2
}

и использование

search_region_codes NUMBER FILE
0 голосов
/ 06 октября 2009

Вы ищете весь код региона или код региона, который содержит подшаблон?

Если вам нужен весь код региона, и с обеих сторон есть хотя бы один пробел, вы можете отформатировать grep, добавив один пробел с каждой стороны от конкретного кода региона. Есть и другие способы обозначить границы слов с помощью регулярных выражений.

grep ' 04 ' numbers.txt

Если в полях имени или номера телефона могут быть пробелы, это решение может не сработать. Кроме того, если шаблон может быть частью кода региона, то awk - лучший инструмент. Это предполагает, что поле «имя» не содержит пробелов. Оператор сопоставления '==' требует, чтобы шаблон точно совпадал с полем. Это может быть сложно, когда есть пробелы по обе стороны поля.

awk '$2 == "04" {print $0}' < numbers.txt

Если файл имеет разделитель, его можно установить в awk, используя аргумент '-F' для awk для установки символа разделителя полей. В этом примере запятая используется в качестве разделителя полей. Кроме того, оператор сопоставления в этом примере представляет собой «~», позволяющий шаблону быть любой частью кода региона (если это применимо). «/ Y» - это способ сопоставления рабочих границ в начале и конце выражения.

awk -F , '$2 ~ /\y04\y/ {print $0}' < numbers.txt

В обоих примерах {print $ 0} является необязательным, если вы хотите, чтобы была напечатана полная строка. Однако, если вы хотите выполнить какое-либо форматирование на выходе, это можно сделать внутри этого блока.

0 голосов
/ 06 октября 2009

использовать границы слов. не уверен, что это работает в grep, но в других реализациях регулярных выражений я бы окружил его пробелами или шаблонами границ слов

'\s+04\s+' or '\b04\b'

Нечто подобное

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...