Ваш Perl не слишком далеко.
Помните, что команда замещающего формата - s/pattern/replacement/flags
, как и в sed
. Шаблон представляет собой регулярное выражение , где одна точка переводится как «любой отдельный символ». Чтобы сопоставить литерал точку, вам нужно экранировать ее с обратной косой чертой или заключить в квадратные скобки.
perl -p -i.backup -e 's/\.([^0-9])/-1\1/g' abc.txt
Это соответствует буквенным точкам, за которыми следует что-то отличное от цифры, и заменяет их заменяющей строкой вместе с любым нечисленным символом (\1
). Похоже, что Perl считает ноль в конце строки нецифровым, что позволяет заменять точки в конце строки.
Обратите внимание, что в Perl вы также можете заменить [^0-9]
на [^\d]
или \D
и \1
на $1
. Но первый работает только в Perl и (некоторых) инструментах GNU, а последний - не самая распространенная нотация среди инструментов командной строки. Лично я предпочел бы сделать свои регулярные выражения и замены более переносимыми, чтобы, если бы я переключился с Perl на, скажем, awk, мне не пришлось бы переписывать столько кода.
Например:
gawk '{$0=gensub(/\.([^0-9])/,"-1\1","g")}1' abc.txt > ,$$ && mv ,$$ abc.txt
или
sed -i.backup -Ee 's/\.([^0-9])/-1\1/g' abc.txt
Переносимость, как правило, хорошая вещь, если вы можете управлять ею.