Вот Perl-решение:
perl -0777 -ne 'print $1,$2 if m/(dove.bird.bunny)(.*)/sm' myfile
Этот вывод:
dove
bird
bunny
gnu
hen
dove
bird
buffalo
Переключатель -0777
включает режим slurp , при котором весь файл считывается в память. использование модификаторов sm
для соответствия позволяет точке соответствовать новой строке, при этом строка обрабатывается как несколько строк.
Переключатель -n
создает цикл чтения входного файла. Когда видна последовательность dove.bind.bunny , она захватывается в $1
с остальными строками в $2
, и это то, что печатается, если полное совпадение успешно.
При использовании скрипта с source
или .
содержимое скрипта выполняется в текущей среде оболочки. Любые функции, определенные в исходном сценарии, будут доступны в текущей оболочке после получения, а также любые переменные оболочки (без необходимости экспорта ). Это цель получения сценария.
Вот как файл /etc/profile
или /etc/bash.bashrc
может настроить базовую среду, например, для интерактивной оболочки/оболочки входа в систему.
Кроме того, некоторые команды выполняются в среде подоболочки, которая является дубликатом среды оболочки. В такой среде доступны переменные оболочки и функции. См. также стандарт POSIX о Shell Execution Environment(мой акцент):
A subshell environment shall be created as a duplicate of the shell environment, except that signal traps that are not being ignored shall be set to the default action. Changes made to the subshell environment shall not affect the shell environment. Command substitution, commands that are grouped with parentheses, and asynchronous lists shall be executed in a subshell environment. Additionally, each command of a multi-command pipeline is in a subshell environment; as an extension, however, any or all commands in a pipeline may be executed in the current environment. All other commands shall be executed in the current shell environment.
Обратите внимание, что подоболочка отличается от дочернего процесса.
Экспорт переменной необходим только для создания переменной среды. Переменные среды наследуются любым дочерним процессом.
Также обратите внимание, что наличие каталога с именем ~/.bash_profile
немного сбивает с толку, так как оболочка bash
попытается найти источник обычный файл~/.bash_profile
при запуске оболочки входа в систему. Я предлагаю вам переименовать ваш каталог ~/.bash_profile
во что-то вроде ~/.shell
или ~/.shell_startup
, если вы хотите переместить файлы инициализации оболочки в другое место.Эти файлы по-прежнему должны вызываться из ~/.bash_profile
и ~/.bashrc
, если вы хотите, чтобы они были получены автоматически.