Как изменить формат переменных подстановки в шаблоне - PullRequest
3 голосов
/ 27 октября 2008

Мне нужно перебрать файлы в каталоге и выполнить следующую замену.

До:

Здравствуйте, $ {USER_NAME}, вы живете по адресу $ {HOME_ADDRESS}. Сейчас $ {TIME}

После того, как:

Здравствуйте, $ {userName}, вы живете по адресу $ {HomeAddress}. Сейчас $ {время}

Количество различных токенов, которые появляются в $ {}, велико, поэтому запускать не реально:

find . -name '*' -exec sed -i 's/${USER_NAME}/${userName}/g' {} \;
find . -name '*' -exec sed -i 's/${TIME}/${time}/g' {} \;
* * Тысяча двадцать-одина и т.д.

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

find . -name '*' -exec sed 's/XXX/YYY/g' {} \;

Но я не могу понять, что заменить XXX и YYY. Можно ли сделать это одной командой?

Ура, Донал

Ответы [ 3 ]

4 голосов
/ 28 октября 2008

Отформатировано для ясности:

sed -i '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g 
                   s/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g 
                   s/\$\{TIME\}/\$\{time\}/g
                  }'

Где /^Hello/ определяет строки, по которым вы хотите действовать (сделайте их более конкретными, если это необходимо), а остальные заменяют каждое имя переменной.


Если вы записываете это в сценарий, рассмотрите возможность использования документа ЗДЕСЬ, чтобы сохранить форматирование и облегчить чтение и обновление ...

2 голосов
/ 27 октября 2008

Флаг -i для sed будет редактировать файл на месте. Для XXX и YYY вы должны использовать что-то вроде:

sed -i 's/USER_NAME/userName/g'

и т. Д.

Обновление: я вижу, что ваш вопрос действительно касался автоматического изменения имени пользователя USER_NAME на userName. Вы можете попробовать этот скрипт на Perl:

sub convert {
    my $r = lc $_[0];
    $r =~ s/_(.)/\U$1\E/g;
    return $r;
}
while (<>) {
    s/\${([A-Z_]+)}/\${@{[convert $1]}}/g;
    print;
}

Запустите его так:

perl -i convert.pl inputfile.txt

Пример вывода:

$ cat inputfile.txt
Hello ${USER_NAME}, you live at ${HOME_ADDRESS}. It is now ${TIME}
$ perl -i convert.pl inputfile.txt
$ cat inputfile.txt
Hello ${userName}, you live at ${homeAddress}. It is now ${time}
0 голосов
/ 28 октября 2008

Ответ выше работает очень хорошо. Для полноты могу добавить, что вы можете сделать:

sed '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g' <filename> \
   | sed 's/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g' \
   | sed 's/\$\{TIME\}/\$\{time\}/g'

Они функционально идентичны (за исключением того, что мои дампы выводятся в stdout; вам придется их где-то поместить (но вы можете сохранить оригинал на тот случай, например, если вы будете регулярно портить регулярные выражения). Мне нравятся мои формулировка только потому, что я могу начать с одной команды sed, а затем добавить еще

!! | sed 'yet-enother-regexp'

клавиши со стрелками? VI-режим? Кому это нужно? :)

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