Попытка произвести замену с помощью perl - PullRequest
2 голосов
/ 27 мая 2020

У меня есть этот текст:

rojo

Я хочу сделать замену и превратить ее в:

rojo77

Итак, я пробую это:

perl -pi.bak -e "s/(ojo)/$177/g" oven.txt

Если бы я хотел заменить на текст вместо 77, у меня не было бы проблем, но, будучи числом, я получаю это в результате:

r

То есть соответствует ojo, но замена не работает, поэтому все совпавшие просто удаляются. Как я могу использовать $1 и использовать рядом с ним номер?

Пожалуйста, помогите!

Ответы [ 3 ]

4 голосов
/ 27 мая 2020

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

s/ojo/ojo77/

Но если вы хотите использовать подстановку переменной, вы можете сделать:

s/(ojo)/${1}77/

Как прокомментировано zdim , это также может быть выражено с помощью специального утверждения \K, что в основном означает Оставьте вещи :

s/ojo\K/77/
2 голосов
/ 27 мая 2020

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

perl -pi.bak -e "s/ojo\K/77/g" oven.txt

Я пишу об этом подробнее в Игнорировать часть совпадения подстановки

Кроме того, помните, как Perl определяет имя переменной. После сигилы вводятся все символы допустимого идентификатора. Поскольку 177 - допустимое имя переменной (даже если у вас не так много захватов), вы получите именно такое имя. Чтобы отделить имя переменной от остального текста, вы можете заключить имя переменной в фигурные скобки (сигил все еще снаружи):

"r$177"   # variable named 177
"r${1}77" # variable 1 
0 голосов
/ 27 мая 2020

Есть другой способ, используя e для объединения значений в заменах.

s/(ojo)/$1.77/eg; # '.' dot will merge/concatenate the values from left and right 

Спасибо за указание на champ zdim в комментариях к моему ящику:

s/(ojo)/$1.q(77)/eg;

Оценивает замену, как если бы это был оператор Perl, и использует его возвращаемое значение в качестве текста замены e

...