Самый простой способ, который я могу придумать, это использование GNU grep
:
$ grep -Po '<\K[^>]+(?=>)' file
jdyefc@nsuwtcvc
ejd2ydt2@dv2dg2vgv
i2dmi32@hd2vdg
2udhu2@cdrrc
Параметр -o
означает "печатать только совпадающую часть строки", а -P
активирует Perl-совместимые регулярные выражения. Это позволяет нам использовать \K
, что означает "не считать частью совпадения все, что совпало до этого момента" и положительные lookaheads. Таким образом, регекс будет соответствовать , затем любому отрезку не
>
символов, за которым следует >
.
Обратите внимание, что это также будет соответствовать
, который не является электронным письмом. Чтобы ограничить только электронные письма (строки с @
), вы можете использовать:
grep -Po '<\K[^>]+@[^>]+(?=>)' file
Когда вы используете source
, файл читает текущая оболочка, а не оболочка, упомянутая в строке #!
. И я предполагаю, что ваша оболочка - это либо zsh
, либо ksh93
, которая использует read -p
для чтения из сопроцесса.
Пример этого в ksh93
:
cat /etc/passwd |&
while IFS=":" read -p user rest; do
printf 'There is a user called %s\n' "$user"
done
Чтобы запустить ваш скрипт, либо явно укажите интерпретатор:
$ bash script.sh
... либо сделайте скрипт исполняемым и запустите его:
$ chmod +x script.sh
$ ./script.sh
Чтобы заставить read
использовать пользовательскую подсказку в zsh
и ksh93
:
read username"?What's you name? "
printf 'Hello %s!\n' "$username"