
У меня есть такой файл
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).