Сfind
:
find. -type f -name '*.out' -exec grep -q 'PATTERN' {} ';' \
-exec sh -c 'cp "$1" "${1%.out}.gdx" /somewhere' sh {} ';'
В качестве альтернативы:
find. -type f -name '*.out' -exec grep -q 'PATTERN' {} ';' \
-exec sh -c 'for name do cp "$name" "${name%.out}.gdx" /somewhere; done' sh {} +
Это найдет все файлы в текущей папке или ниже, имена которых заканчиваются на .out
. Если файл .out
имеет строку, совпадающую с PATTERN
, файл .gdx
в том же каталоге с тем же префиксом имени, что и файл .out
, будет скопирован в /somewhere
вместе с файлом .out
..
Проверка того, существует ли уже запись каталога под /somewhere
с тем же именем, что и у копируемых файлов, или действительно ли изначально существует файл .gdx
, не выполняется.
См. также:
sed -i 's/# + : STANDANRD\\ADMIN_USERS_ONLY : ALL//g' config_file
должно помочь. Обратите внимание на двойную обратную косую черту, которая важна, поскольку обратная косая черта, за которой следует символ, имеет особое значение для синтаксического анализатора регулярных выражений. Эти метасимволы являются ярлыками для таких вещей, как пробел (\s
), буквенно-цифровой символ(\w
)или, в случае \A
начало строки (статья Википедии о регулярных выражениях содержит таблицу суммируя самые популярные метасимволы ). Поскольку обратная косая черта имеет особое значение, вы должны ввести двойную обратную косую черту, если хотите, чтобы в вашем файле соответствовала одна обратная косая черта.
Пример вывода на CentOS 7:
[tux@centos7 ~]$ cat config_file
# + : STANDANRD\ADMIN_USERS_ONLY : ALL foo
[tux@centos7 ~]$ sed -i 's/# + : STANDANRD\\ADMIN_USERS_ONLY : ALL\(.*\)/\1/g' config_file
[tux@centos7 ~]$ cat config_file
foo