Запрос на изменение содержимого Linux в файле на основе имени файла - PullRequest
0 голосов
/ 07 марта 2012

Я знаю, как выполнять поиск и замену среди группы файлов:

perl -pi -w -e 's / search / replace / g;'* .php

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

Я хочу выполнить поиск и заменить все мои php-файлы, чтобы найти конкретное ключевое слово, и заменить его именем файла за вычетом расширения.

Пример: поищите в файле Mountains.php ключевое слово Trees, и везде, где вы видите Trees, замените его на Mountains

Конечно, я хочу сделать это в пакетном режиме, для некоторыхсотни php-файлов с разными именами, но все они содержат искомый термин Trees.

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

Пример. Найдите в файле MountainTowns.php ключевое слово "Деревья", и везде, где вы видите деревья, замените его на "Горные города" (обратите внимание на то, что дополнительные буквы в заглавных буквах могут указывать, куда идут пробелы)

Спасибо, что уделили время и рассмотрели мой вопрос.

Ответы [ 3 ]

2 голосов
/ 07 марта 2012

Ну, имя файла в $ ARGV, так что больше не нужно много работы.

perl -i -pe '($x=$ARGV)=~s{.php$}{};s{Trees}{$x}g' BlueMountains.php RedMountains.php

Добавьте

$x=~s{(.)([A-Z])}{$1 $2}g;

, чтобы добавить пробел перед заглавными буквами, дляполная линия

perl -i -pe '($x=$ARGV)=~s{.php$}{};$x=~s{(.)([A-Z])}{$1 $2}g;s{Trees}{$x}g' BlueRedMountains.php
0 голосов
/ 13 марта 2012

Это может работать для вас:

printf "%s\n" *.php |perl -pwe 's|(.*).php|perl -pi -we "s/Trees/$1/g;" $&|' | bash

Используется Perl для написания скрипта для выполнения ставок.

Могут быть использованы другие маленькие языки, такие как awk или:

 printf "%s\n" *.php |sed 'h;s/\.php//;s/\B[A-Z]/ &/;G;s|\(.*\)\n\(.*\)|sed -i "s/Trees/\1/g" \2|' | bash

Это использует sed, чтобы обеспечить решение для второго запроса.

0 голосов
/ 07 марта 2012

Вы хотите отдельную замену для каждого файла, поэтому запустите отдельный поиск и замену для каждого:

for file in *.php; do sed -i "s/foo/${file%.*}/g" "$file"; done

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

for file in *; do sed -i "s/bar/$(echo ${file%.*} | sed 's/\(.\)\([A-Z]\)/\1 \2/')/g" "$file"; done

Это немного более читабельно, если вы поместите его в скрипт:

#!/bin/bash 
for file in "$@"; do
        replacement=$(echo ${file%.*} | sed 's/\(.\)\([A-Z]\)/\1 \2/')
        sed -i "s/bar/$replacement/g" "$file"; 
done

Это будет работать со всеми переданными им аргументами, поэтому вызывайте с ./script.sh *.php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...