Вот решение awk, которое предполагает, что каждый блок имеет длину ровно 4 строки.
awk -F ':' '
NR % 4 == 1 { keep = ($5 < 1101 || $5 > 1103) }
keep
'
Пояснения:
-F :
устанавливает разделитель полей на :
. $5
— пятое поле в текущей строке (, пронумерованное от 1 ). NR % 4 == 1 { … }
выполняет код в фигурных скобках, если условие NR % 4 == 1
верно, т.е. если номер текущей строки кратен 4 плюс 1. keep = (…)
устанавливает переменную keep
в заданное состояние. keep
, указывает на то, что нужно напечатать текущую строку, если переменная keep
верна. Поскольку keep
устанавливается только через каждые 4 строки, он одинаково применяется ко всем строкам в 4-строчном блоке -. Если используемое вами регулярное выражение всегда корректно, вы можете использовать его с Perl:
% perl -pe 's/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}/\L$&/' foo
stackoverflow@icloud.com:Portuguesa-Span103
stackoverflow@gmail.com-Snip1031
stackoverflow@icloud.com:Sanchismo103
$&
— это совпадающий текст, а \L
переводит все после него в нижний регистр (до \E
, но здесь это не нужно ).
Поскольку вы используете GNU sed, вы можете использовать:
sed -e 's/^\([^@]*\)@/\L\1@/' file
Это преобразует все от начала строки до первого @
в нижний регистр. например.
$ sed -e 's/^\([^@]*\)@/\L\1@/' input.txt
stackoverflow@icloud.com:Portuguesa-Span103
stackoverflow@gmail.com-Snip1031
stackoverflow@icloud.com:Sanchismo103
Если адреса электронной почты не находятся в начале каждой строки и/или если в строке может быть несколько адресов электронной почты, следует использовать \b
вместо ^
для привязки поиска -и -заменить на слово -граничный маркер вместо начала строки:
sed -e 's/\b\([^@]*\)@/\L\1@/g' input.txt