Как искать, заменять и добавлять шаблон в конец каждой строки

Как искать, заменять и добавлять шаблон в конец каждой строки

У меня есть следующий список вещей:

bigBone
fishMarket
dogCollar
...

Мне нужно сгенерировать сопоставление двух символов, например:

bigBone -> bb
fishMarket -> fm
dogCollar -> dc
...

Как создать указанное выше сопоставление, используя sed?

Я пробовал что-то вроде:

sed -i -r 's/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/ -> \1\L\2/' file

Я виделэтот вопрос, но не уверен, как включить эту концепцию сюда. Спасибо.

решение1

Если я правильно вас понял, то вы хотите сохранить всю строку и просто добавить что-нибудь:

sed -r 's/^([a-z]{1})([a-z]+)([A-Z]{1})([a-zA-Z]+)$/\1\2\3\4 -> \1\L\3/' file

редактировать:

devnull пришлось мне напомнить, что есть простое решение этой проблемы:

sed -r 's/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/& -> \1\L\2/' file

Или немного более элегантно (чем моя первая попытка):

sed -r '
h
s/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/ -> \1\L\2/
t append
b
: append
H
g
s/\n//' file

решение2

Используя GNU sed:

sed -r 's/(.)[^[:upper:]]*(.).*/& -> \1\L\2/' inputfile

В ответ на ваш запрос будет выдано следующее:

bigBone -> bb
fishMarket -> fm
dogCollar -> dc

решение3

Обобщим до fooBarBaz -> fbb, abCdEfGh -> aceg, с GNU sed:

sed -r 's/(.)(.*)/\1\n\2 -> \L\1/;:1
        s/\n([^[:upper:]]*([[:upper:]]))(.*)/\1\n\3\L\2/;t1;s/\n//'

В POSIX sedнет \L. Так что в переносимом виде вам придется прибегнуть к использованию yи вручную вводить все символы, которые вы хотите преобразовать в нижний регистр. Что-то вроде:

LC_ALL=C sed '/^\([[:alpha:]]\).*/{
h;s//\1/;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;G
s/\(.\).\(.\)\(.*\)/\2\
\3 -> \1/;:1
/.*\n[^A-Z]*\([A-Z]\).*/{h;s//\1/
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;G
s/^\(.\)\n\(.*\)\n\([^A-Z]*[A-Z]\)\(.*\)/\2\3\
\4\1/;t1
}
s/\n//;}'

решение4

Этот ответ очень похож на ответ @devnull,

$ sed 's/\(.\).*\([A-Z]\).*/& -> \1\L\2/g' file
bigBone -> bb
fishMarket -> fm
dogCollar -> dc

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