Прописные последние n символов каждой строки в словаре regexp
Я ищу способ прописать последние n символов каждой строки в списке слов, используя регулярное выражение. Пример с n=3:
Входные данные:
thisisatest
uppercasethelast3characters
Желаемый результат:
thisisatEST
uppercasethelast3charactERS
3 ответа
Решение
Используйте этот GNU sed
:
sed -e 's/^\(.*\)\(.\{3\}\)$/\1\U\2/' file
С расширенным регулярным выражением:
sed -r 's/^(.*)(.{3})$/\1\U\2/' file
Тестовое задание:
$ sed -e 's/^\(.*\)\(.\{3\}\)$/\1\U\2/' file
thisisatEST
uppercasethelast3charactERS
Так как вы пометили Perl, я выкладываю решение Perl...
# with RegEx
perl -nle '/(.*)(.{3})$/; print $1 . uc $2;' file.txt
# formatted with n at the end
cat file.txt | perl -nle 'print $1 . uc $2 if /(.*)(.{3})$/;'
# or without RegEx
perl -nle '$n=3; print substr($_,0,-$n).uc substr($_,length($_)-$n);' file.txt
# formated with n at the end
cat file.txt| perl -nle 'print substr($_,0,-$n).uc substr($_,length($_)-$n) if $n=3;'
substr
Решение будет намного быстрее, чем захват регулярных выражений.
Без \U
особенность (это особенность GNU), она немного менее удобна:
sed -e 'h;s/.\{3\}$//;x;s/.*\(.\{3\}\)/\1/;y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/;H;g;s/\n//;' file
подробности:
h # copy the pattern space into the buffer space
s/.\{3\}$// # remove the 3 last characters (in the pattern space)
x # exchange the pattern space and the buffer space
s/.*\(.\{3\}\)/\1/ # remove all characters except the three last
# translate lower case to upper case letters
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
H # append the pattern space to the buffer space
g # replace the pattern space with the buffer space
s/\n// # remove the newline character