Некоторые проблемы с заменой:
- Вы говорите, что хотите соответствовать
by:
(пробел после двоеточия), но ваше регулярное выражение никогда не будет соответствовать пробелу. - Шаблон
[a-z]+
означает совпадение одного или нескольких вхождений букв от a
до z
.Но вы сказали, что хотите соответствовать «любым персонажам».Это может быть ноль символов и оно может содержать не буквы. - Вы заменили совпадение на
$foo
, но потеряли by:
.Вся совпадающая строка заменяется заменой. - Нет необходимости экранировать
:
в вашем шаблоне. - Вы фиксируете все совпадение в скобках, но нигде не используете это.
Я предполагаю, что вы обрабатываете файл построчно.Вы хотите «начинается со строки by:
, за которой следуют любые символы».Это регулярное выражение:
/^by: .*/
^
соответствует началу строки.Тогда by:
соответствует именно этим символам..
соответствует любому символу, кроме новой строки, а *
означает ноль или более предыдущего элемента.Так что .*
соответствует всем остальным символам в строке.
"замените любые символы, которые следуют после by:
, на существующую строку $foo
. Я предполагаю, что вы имеете в виду содержимое переменной $foo
а не буквенные символы $foo
. Это:
s/^by: .*/by: $foo/;
Поскольку мы сопоставили by:
, я повторил его в строке замены, потому что вы хотите сохранить его. $foo
будет интерполирован встрока замены.
Другой способ написать это будет:
s/^(by: ).*/$1$foo/
Здесь мы захватили текст by:
в первом наборе скобок. Этот текст будет доступен впеременная $1
, поэтому мы можем интерполировать ее в строку замены.