замена точки на символ с помощью sed или perl

замена точки на символ с помощью sed или perl

У меня есть такой файл

KN1234.1
KN2345.1
KN1233.1

Я хочу заменить . на v, чтобы получить вывод в виде

KN1234v1
KN2345v1
KN1233v1

После . всегда 1, но после KN я также могу иметь до 5 цифр. Что-то вроде этого тоже возможно, KN14345.1и его вывод должен бытьKN14345v1

Я попробовал команду sed

sed 's/KN\d+.1/KN\d+v1/g' file.txt

но ничего не произошло. Как это исправить?

Также было бы желательно получить решение на Perl.

Спасибо

решение1

Этот:

sed 's/KN\d+.1/KN\d+v1/g' file.txt

ничего не делает, потому что ваш sed вряд ли поддержит \d(я думаю, это из Perl), поэтому шаблон не соответствует ничему. Вы можете обратиться к этому:Почему мое регулярное выражение работает в X, но не в Y?

В любом случае это не будет работать так, как вам хотелось бы, поскольку в сменной детали \dпросто отсутствует код , и он не является специальным, поэтому ваши цифры будут заменены.d+

В Perl вам может понадобиться что-то вроде этого:

perl -pe 's/(KN\d+)\.1/$1v1/'  file.txt 

Где $1расширяется до первой группы в скобках, а точка экранируется, так как это регулярное выражение длялюбой персонаж. Или

perl -pe 's/KN\d+\K\.1/v1/'  file.txt 

Где \Kубивает предыдущую часть матча, так что она не заменяется.

Хотя, если вас не волнует контекст точки, используйте tr. (или tr///в Perl).

Связанный контент