Исключение слов в шаблоне без использования опции -v в (e) grep - PullRequest
0 голосов
/ 01 мая 2019

Возможно ли исключить точное слово (слова) в (e) grep, используя только шаблон, без использования опции -v.Например, поскольку () группирует шаблон или точную строку (), я думал, что egrep [^(main)] будет соответствовать подстрокам без точного слова main, но в этом случае исключается буква m,a,i,n.Я все еще изучаю регулярные выражения в bash.

Ответы [ 3 ]

1 голос
/ 01 мая 2019

Вы можете использовать это отрицательное регулярное выражение, чтобы отклонить строку, содержащую main как целое слово и не обязательно использовать -v обязательно.

grep -P '^(?!.*\bmain\b).*$' bash.txt

Здесь -P включает Perl regular expression

Перед тем, как содержимое файла с именем bash.txt,

hello 123
hello world
hello main world
some main text
some mainly text

И после выполнения вышеуказанной команды выводит этот вывод,

hello 123
hello world
some mainly text
0 голосов
/ 02 мая 2019

idk, если это то, что вы хотите или нет, но заимствовать @ пример Pushpesh , затем с любым POSIX awk:

$ awk '!/(^|[^[:alpha:]])main([^[:alpha:]]|$)/' file
hello 123
hello world
some mainly text

или использовать инструменты GNU для границ слов:

$ awk '!/\<main\>/' file
hello 123
hello world
some mainly text

$ sed '/\<main\>/d' file
hello 123
hello world
some mainly text
0 голосов
/ 01 мая 2019

Причина

egrep [^ (main)] исключает букву m, a, i, n.

в том, что [^ (main)] соответствуетодиночный символ, который не содержится в скобках, который исключает не только m, a, i, n, но также (и).Вы можете найти правильное использование этой функции здесь .

На самом деле, уже есть похожий вопрос StackOverflow .У него есть несколько форм негативного прогнозирования.^((?!main).)*$ может быть одним из них, удовлетворяющих вашу потребность.

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