grep regex игнорируя среднюю часть - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть файл с именами получателей, подобными этому

Кому: Джон Смит (Джонни)

Кому: Джейн Доу (jane)

Кому: Ричард Ларах (член)

Я хочу, чтобы совпадение возвращало только псевдоним:

Джони

джан

член

Я пытаюсь сопоставить регулярное выражение для To: и (игнорируя среднюю часть, выводя только псевдоним, если совпадает.

Я пытался

grep -e "To:*\("
grep -e "To: * \("
grep -e /To: * \(/

Я не уверен, что проблема в пробелах, или я что-то напутал. Я также не могу просто соответствовать (так как есть другие случаи (

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Если вам нужна только часть псевдонима, попробуйте следующую команду:

sed "s/.*(\(.*\))$/\1/g" input_filename

Это будет работать только в том случае, если есть одна пара (). В случае нескольких пар, пожалуйста, используйте cut (учитывая, что строка заканчивается псевдонимом

rev input_filename | cut -d \( -f1 | cut -d \) -f2 | rev

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

0 голосов
/ 05 ноября 2018

Если вы используете gnu grep, вы можете использовать \K, чтобы забыть то, что было ранее найдено, и положительный прогноз (?=, чтобы утверждать, что ниже следует закрывающая скобка.

grep -Po '\bTo:.*?\(\K[^()]+(?=\))' inputfile
0 голосов
/ 05 ноября 2018

Команда grep - это просто фильтр для строк текстового файла, поэтому она только выбирает и выводит целые строки, которые совпадают; чтобы вырезать нужные кусочки, вам нужен «sed» (или, что еще лучше, переключитесь на perl).

grep "To:[^(]*(${nickname})" Соответствует псевдонимам, которые вы хотите.

sed 's/To:[^(]*(\([^)]*\))/\1/g' фактически заменяет каждую полную запись псевдонимом.

Здесь части "[^(]*" и "[^)]*" означают любую строку, которая не содержит левой и правой скобок.

Это то, что вы хотите?

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