Только адреса электронной почты в нижнем регистре

Вот решение 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-строчном блоке -.
0
27.07.2019, 13:49
2 ответа

Если используемое вами регулярное выражение всегда корректно, вы можете использовать его с 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, но здесь это не нужно ).

0
28.01.2020, 03:25

Поскольку вы используете 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
0
28.01.2020, 03:25

Теги

Похожие вопросы