Греп ищет два слова в строке

Вы можете изменить обработчик по умолчанию для магнитных ссылок, отредактировав файл .local / share / applications / mimeapps.list. Добавьте ассоциацию к двум разделам в файле, подобным этому (оставив другие записи в этих разделах неповрежденными):

[Default Applications]
x-scheme-handler/magnet=transmission-gtk.desktop

[Added Associations]
x-scheme-handler/magnet=transmission-gtk.desktop

Выйдите из системы и войдите в систему, чтобы изменения вступили в силу.

1
задан 8 January 2018 в 18:11

5 ответов

Вы можете передать вывод первой команды grep другой команде grep и которая будет соответствовать обоим шаблонам. Итак, вы можете сделать что-то вроде:

grep <first_pattern> <file_name> | grep <second_pattern>

или

cat <file_name> | grep <first_pattern> | grep <second_pattern>

Пример:

Давайте добавим некоторое содержимое в наш файл: [!d3 ]

$ echo "This line contains lemon." > test_grep.txt
$ echo "This line contains rice." >> test_grep.txt
$ echo "This line contains both lemon and rice." >> test_grep.txt
$ echo "This line doesn't contain any of them." >> test_grep.txt
$ echo "This line also contains both rice and lemon." >> test_grep.txt

Что содержит файл:

$ cat test_grep.txt 
This line contains lemon.
This line contains rice.
This line contains both lemon and rice.
This line doesn't contain any of them.
This line also contains both rice and lemon.

Теперь давайте посмотрим, что хотим:

$ grep rice test_grep.txt | grep lemon
This line contains both lemon and rice.
This line also contains both rice and lemon.

Мы получаем только строки, в которых оба шаблона совпадение. Вы можете расширить это и передать вывод в другую команду grep для дальнейших совпадений «AND».

21
ответ дан 23 May 2018 в 22:53

Хотя вопрос задает «grep», я подумал, что было бы полезно отправить простое решение awk:

awk '/lemon/ && /rice/'

Это можно легко расширить с помощью большего количества слов или других булевых выражений кроме 'и'.

16
ответ дан 23 May 2018 в 22:53

Еще одна идея найти совпадения в любом порядке:

grep с опцией -P (Perl-Compatibility) и позитивным регулярным выражением (?=(regex)):

grep -P '(?=.*?lemon)(?=.*?rice)' infile
[d4 ] или вы можете использовать ниже:

grep -P '(?=.*?rice)(?=.*?lemon)' infile
.*? означает сопоставление любых символов ., которые появляются ноль или более раз *, в то время как они являются необязательными, за которым следует шаблон (rice ] или lemon). [F10] делает все необязательным перед ним (означает нуль или одно время всего, что соответствует .*)

(?=pattern): Положительный Lookahead: положительная конструкция lookahead представляет собой пару круглых скобок с открывающейся скобкой после чего следует знак вопроса и знак равенства.

Таким образом, это вернет все строки, содержащие как lemon, так и rice в случайном порядке. Также это позволит избежать использования | s и удвоить grep s.

Внешние ссылки: расширенные темы Grep Positive Lookahead - GREP для дизайнеров

10
ответ дан 23 May 2018 в 22:53
grep -e foo -e goo

Вернет совпадения для foo или goo

2
ответ дан 23 May 2018 в 22:53

Вот скрипт для автоматизации решения grep piping:

#!/bin/bash

# Use filename if provided as environment variable, or "foo" as default
filename=${filename-foo}

grepand () {
# disable word splitting and globbing
IFS=
set -f
if [[ -n $1 ]]
then
grep -i "$1" ${filename} | filename="" grepand "${@:2}"
else
# If there are no arguments, assume last command in pipe and print everything
cat
fi
}

grepand "$@"
0
ответ дан 23 May 2018 в 22:53
  • 1
    Вероятно, это должно быть реализовано с использованием рекурсивной функции, вместо создания командной строки и eval, что легко ломается – muru 3 February 2017 в 05:42
  • 2
    @muru Не стесняйтесь предлагать редактирование. Я ценю комментарий. – Jeff 3 February 2017 в 05:46
  • 3
    Редактирование, это будет слишком много переписывать, поэтому я не буду этого делать. Если вы хотите добавить его, вот что я думаю, это должно выглядеть так: paste.ubuntu.com/23915379 – muru 3 February 2017 в 06:36

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

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