Perl не использует \1
для подстановки. Если бы вы включили предупреждения (например, с perl -w
), Perl сказал бы, что это $1
. Который можно убрать из окружающих цифр, добавив {
}
:
perl -pe 's|(.*time"\s*:\s*").*?(".*)|${1}20:00:00$2|g'
(Я также удалил все избыточные обратные слэши из регулярного выражения.)
С другой стороны, какой смысл сопоставлять .*
, если вы просто собираетесь заменить его самостоятельно? Разве это не может быть
perl -pe 's|(time"\s*:\s*").*?(")|${1}20:00:00$2|g'
Я не большой поклонник .*
или .*?
. Если вы пытаетесь сопоставить внутреннюю часть строки в кавычках, было бы лучше указать:
perl -pe 's|(time"\s*:\s*")[^"]*(")|${1}20:00:00$2|g'
Мы не пытаемся проверить входную строку, так что теперь действительно нет причин совпадать с этим окончательным "
(и заменить его самостоятельно):
perl -pe 's|(time"\s*:\s*")[^"]*|${1}20:00:00|g'
Если ваш perl не древний (5.10+), вы можете использовать \K
, чтобы «сохранить» ведущие части строки, то есть не включить его в матч:
perl -pe 's|time"\s*:\s*"\K[^"]*|20:00:00|g'
Теперь будет заменена только часть [^"]*
, что избавит нас от необходимости делать захват.