Искать два последовательных шаблона с любым количеством символов между ними, используя grep [duplicate]

Вот практический эксперимент, который делает именно то, о чем вы спрашивали; он запускает bash, устанавливает переменную среды, затем запускает tcshи меняет ее значение. Затем он проверяет значение в bash.

#!/bin/bash

export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"

tcsh -c 'echo $SPORT; setenv SPORT archery; echo $SPORT'

printf 'SPORT is "%s"\n' "$SPORT"

Выполнение этого сценария bash, который вызывает tcsh, приведет к

SPORT is "baseball"
baseball
archery
SPORT is "baseball"

Но нам даже не нужно переключаться на tcsh, чтобы увидеть это в действия, достаточно ввести подоболочку, которая имеет отдельную среду, с (...)в нашем сценарии bash:

#!/bin/bash

export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"

(
    echo "$SPORT"
    export SPORT=archery
    echo "$SPORT"
)

printf 'SPORT is "%s"\n' "$SPORT"

Вывод останется прежним.

Одна среда не может влиять на другую за одним исключением: новая среда наследует переменные среды от родительской среды. Подоболочка (как в последнем примере) также наследует неэкспортированные переменные оболочки.

0
21.06.2018, 14:39
2 ответа

Используйте.*:

grep "${word1}.*${word2}" "$filename"
  • .соответствует любому символу
  • *соответствует любому номеру предыдущего символа
2
28.01.2020, 02:31

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

grep "\\<$word1\\>.*\\<$word2\\>" "$filename"

Шаблон\<(здесь \\<для экранирования первой обратной косой черты из оболочки )соответствует непосредственно перед словом, и \>работает аналогично, но сразу после слова.

Есть также \b, которые соответствуют до и после, а также [[:<:]]и [[:>:]], которые работают так же, как \<и \>. Какие из них реализованы grepразличаются.

0
28.01.2020, 02:31

Теги

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