Как использовать grep, чтобы получить что-нибудь сразу после `name =`? - PullRequest
57 голосов
/ 08 августа 2009

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

например:.

name=some value here

Я получаю

some value here

Я новичок в этом, следующий grep соответствует всему, включая name=.

grep 'name=.*' filename

Любая помощь очень ценится.

Ответы [ 5 ]

102 голосов
/ 08 августа 2009

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

grep -P '(?<=name=)[ A-Za-z0-9]*' filename

-P заставляет grep использовать диалект Perl, в противном случае вам, вероятно, придется избегать скобок. Вы также можете, как отмечено в другом месте, добавить параметр -o, чтобы распечатать только то, что соответствует. Часть в скобках указывает, что вам нужны буквенно-цифровые символы и пробелы.

Преимущество использования положительного выражения lookbehind состоит в том, что текст "name =" не является частью совпадения. Если grep выделяет совпадающий текст, он выделяет только буквенно-цифровую (и пробелы) часть. Параметр -o также не отображает часть «name =». И, если вы перенесете это в другую программу, например sed, которая может захватывать текст и что-то с ним делать, вы не будете захватывать часть «name =», хотя вы также можете сделать это, используя ввод скобок.

22 голосов
/ 08 августа 2009

Попробуйте это:

sed -n 's/^name=//p' filename

Он говорит, что sed по умолчанию ничего не печатает (-n), заменяет ваш префикс ничем и печатает, если происходит замена.

Бонус: если вам действительно нужно сопоставлять записи только с пробелами и буквенно-цифровыми цифрами, вы также можете сделать это:

sed -n 's/^name=\([ 0-9a-zA-Z]*$\)/\1/p' filename

Здесь мы добавили шаблон для сопоставления пробелов и буквенно-цифровых символов только до конца строки ($), а если мы сопоставим, подставим группу в скобки и напечатаем.

4 голосов
/ 08 августа 2009

простак

echo "name=some value here" | awk -F"=" '/name=/ { print $2}' 

или с bash

str="name=some value here"
IFS="="
set -- $str
echo $1    
unset IFS

или

str="name=some value here"
str=${str/name=/}
4 голосов
/ 08 августа 2009

grep не извлекается так, как вы ожидаете. Что вам нужно, это

grep "name=" file.txt | cut -d'=' -f1-
1 голос
/ 08 августа 2009

grep напечатает всю строку, где она соответствует шаблону. Чтобы напечатать только соответствующий шаблон, используйте опцию grep -o. Возможно, вам также понадобится использовать sed для удаления name = части шаблона.

grep -o 'name=[0-9a-zA-Z ]'  myfile | sed /^name=/d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...