substitution grouping
Если нужно производить так называемые групповые замены - каждую группу нужно заключить в круглые скобки () скобки нужно экранировать поэтому получится \(\)
Рассмотрим файл sites.txt
less sites.txt
AndreyOlegovich.ru IT
Авиасейлз, Travel
Booking.com ,Hotels
Hotellook, Hotels
TopBicycle.ru, Bicycles
Переведём названия сайтов в верхний регистр
sed 's/\([^,]*\)/\U\1/' sites.txt
ANDREYOLEGOVICH.RU, IT
АВИАСЕЙЛЗ, Travel
BOOKING.COM, Hotels
HOTELLOOK, Hotels
TOPBICYCLE.RU, Bicycles
Разберём подробно:
Внутри \(\) первая группа
над которой проводится действие (замена)
\([^,]*\)
[^,]* означает неограниченное количество не запятых
Как только встретится первая запятая группа сформируется, если запятой в строке не будет
выделится вся строка.
\U означает перевести в верхний регистр
&92;1 означает сделать это с первой группой. У нас пока что всего одна группа.
Чтобы работать со второй группой - нужно после первой поставить
, \(\)
Групп может быть много. Синтаксис следующий:
\(\),
\(\),
\(\),
\(\)
Они все должны быть в левой части выражения
/\(\),
\(\),
\(\),
\(\)
/
/
sed 's/\([^,]*\),\([^,]*\)/\U\1\L\2/' sites.txt
ANDREYOLEGOVICH.RU it
АВИАСЕЙЛЗ travel
BOOKING.COM hotels
HOTELLOOK hotels
TOPBICYCLE.RU bicycles
Чтобы запятая не пропадала нужно добавить её между U и L
sed 's/\([^,]*\),\([^,]*\)/\U\1,\L\2/' sites.txt
ANDREYOLEGOVICH.RU, it
АВИАСЕЙЛЗ, travel
BOOKING.COM, hotels
HOTELLOOK, hotels
TOPBICYCLE.RU, bicycles
Что произошло: все до первой запятой было переведенов верхний регистр, затем sed начал искать вторую запятую
для второй группы, не нашёл и перевёл в нижний регистр всю оставшуюся строку.
Рассмотрим файл mod_sites.txt
AndreyOlegovich.ru, IT, abc, DEF
Авиасейлз, Travel, ABC, def
Booking.com, Hotels, abc, def
Hotellook, Hotels, ABC, DEF
TopBicycle.ru, Bicycles,,
Применим к нему тот же самый скрипт
sed 's/\([^,]*\),\([^,]*\)/\U\1,\L\2/' mod_sites.txt
ANDREYOLEGOVICH.RU, it, abc, DEF
АВИАСЕЙЛЗ, travel, ABC, def
BOOKING.COM, hotels, abc, def
HOTELLOOK, hotels, ABC, DEF
TOPBICYCLE.RU, bicycles,,
Как вы можете убедиться, после второй запятой регистр не изменился.
Чтобы его поменять нужна уже третья группа
sed 's/\([^,]*\),\([^,]*\),\([^,]*\)/\U\1,\L\2,\L\3/' mod_sites.txt
ANDREYOLEGOVICH.RU, it, abc, DEF
АВИАСЕЙЛЗ, travel, abc, def
BOOKING.COM, hotels, abc, def
HOTELLOOK, hotels, abc, DEF
TOPBICYCLE.RU, bicycles,,
Теперь между второй и третьей запятыми везде нижний регистр.
Немного более сложный вариант. Этот скрипт добавит запятую перед последними тремя цифрами в числе
s/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g
Надеюсь статья была для вас полезной. Если что-то непонятно - спрашивайте в комментариях, а если они отключены, то в телеграм.