Поиск и замена в файлах

Я нашел следующий удивительный небольшой скрипт по ссылке

$ find / home / bruno / old-friends -type f -exec sed -i 's / ugly / beautiful / g '{} \;

Но я действительно не понимаю последний бит

{} \;

Может кто-нибудь объяснить, пожалуйста?

Спасибо!

5
задан 16 July 2012 в 19:35

3 ответа

Я уже некоторое время использую страницу about.com Linux, которая охватывает

find - поиск файлов в иерархии каталогов

в качестве ссылки для некоторое время, и оно охватывает ту часть команды, о которой вы спрашиваете.

find . -type f -exec file '{}' \;

Запускает файл для каждого файла в текущем каталоге или ниже. Обратите внимание, что фигурные скобки заключены в одинарные кавычки, чтобы защитить их от интерпретации как пунктуации сценария оболочки. Точка с запятой аналогичным образом защищена с помощью обратной косой черты, хотя ';' можно было бы использовать и в этом случае.

Так что я думаю, что ваша команда должна иметь точки с запятой вокруг скобок, чтобы быть в безопасности.

Ссылки:

Статья, объясняющая команду поиска

0
ответ дан 16 July 2012 в 19:35

С exec (а не с xargs) необходимо включить {}, так как оно заменяется именем файла, на который нацелена команда find; это заполнитель, который обычно указывается в кавычках, так что если в любых целевых файлах есть пробелы, команда все равно будет успешно выполняться для всех файлов. semicolon должен быть включен, так как он заканчивает команду, так же, как и при разделении нескольких команд в командной строке. В этом случае должно быть escaped, чтобы команда find получила его из оболочки без расширения (в виде литерала). Есть много обучающих программ по этому вопросу онлайн, см., Например, эту полезную статью.

Еще одна замечательная и действительно важная статья состоит в том, что на сайте Wooledge очень хорошо объясняется команда find, exec и важность цитирования различных элементов в вашей команде или скрипте. Я обнаружил, что эта статья и сайт в целом очень полезны для изучения сценариев bash и bash.

0
ответ дан 16 July 2012 в 19:35

Это не совсем проблема синтаксиса sed, это проблема синтаксиса find.

{} - это контейнер, который заменит имя файла, обрабатываемого командой sed.

Если вы используете find следующим образом:

$ find . -type f -name *.py -exec head {} \;

Это найдет скрипты Python и покажет вам заголовок каждого файла. Если у вас есть три сценария в текущем каталоге:

  • 1.py
  • 2.py
  • 3.py

{} будет содержать каждое имя файла и выполнять команду head для каждого файла.

Аргументу -exec нужен конец ;, чтобы он мог распознать конец аргументов команды (в данном случае sed), но, чтобы защитить ; от раскрытия, вам нужно его избежать с \.

Помните, что вы можете выполнять несколько команд одновременно, если используете ;:

$ ls; pwd;

. В этом списке будут перечислены каталоги (ls) и напечатан ваш рабочий каталог (pwd). Аргумент -exec также нуждается в ;. Но так как вы не хотите путать ;, который разделяет команды, с ;, который является частью аргумента -exec в find, вам нужно экранировать его с \.

В качестве альтернативы, вы можете использовать кавычки вокруг ;:

$ find /home/bruno/old-friends -type f -exec sed -i 's/ugly/beautiful/g' {} ";"

Я надеюсь, что прояснил себя

0
ответ дан 16 July 2012 в 19:35

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

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