2015-03-23 2 views
0

Здесь вы электронная почта пользователя, например ...Bash вырезать и удалить символы

[email protected] 

Я хочу, чтобы вырезать mburkhar, а также удалить imap. в письме, чтобы выглядеть в новом файле. Я работал над этим некоторое время, но есть так много разных команд, я смущен тем, что я должен использовать для этой проблемы.

mburkhar [email protected] 
+0

Вы делаете это для большого количества различных адресов электронной почты, которые выглядят по-разному? Или все они имеют imap1 в качестве начала домена? –

+0

, поэтому у меня есть первая команда, вырезающая имя пользователя с помощью 'cut -d @ -f1 (filename)', но для второй части есть несколько электронных писем, поэтому это может быть похоже на imap1 imap2 или imap3, поэтому я знаю, что буду нужен подстановочный знак '?' в конце –

+0

Вы обрабатываете поток строк (как с входным файлом) или одно значение, уже в переменной оболочки? –

ответ

2
[email protected] 
s_name=${s%%@*} 
s_adjusted=${s//@imap1./@} 
echo "Name is $s_name; adjusted email address is $s_adjusted" 

При запуске, это будет иметь выход:

зовут mburkhar; Скорректированный адрес электронной почты [email protected]

... конечно, для первоначально требуемой мощности, вы можете

echo "$s_name $s_adjusted" 

... или осуществить это как однострочник, предполагая снова исходное значение в переменной $s:

echo "${s%%@*} ${s//@imap1./@}" 

Эти parameter expansion операции, выполнять ed внутренне для bash и, следовательно, более эффективно, чем использование любого внешнего процесса, такого как sed.

1

Я хотел бы использовать быстрый sed скрипт:

sed 's/\([^@]*\)@imap[0-2]\.\(.*\)$/\1 \[email protected]\2/' 
+0

Это позволяет сделать это в стиле хвалебного однострочного ... :-) –

+0

Подход PE аналогичен однолинейному; Я собирался сделать что-то более продолжительное для удобочитаемости. –

+0

Я знаю - я просто отчаянно нуждался в возвращении ... :-) –

1

Вы можете использовать команду sed, чтобы сделать это:

echo "[email protected]" | sed -e 's/^\(.*\)@imap[^\.]*.\(.*\)/\1 \[email protected]\2/' 
mburkhar [email protected] 

Это будет захватить часть до @ игнорировать любую строку, начиная с imap сразу после @ и захватить конец адреса.

Если нет imap не найден выход будет выглядеть следующим образом:

echo "[email protected]" | sed -e 's/^\(.*\)@imap[^\.]*.\(.*\)/\1 \[email protected]\2/' 
[email protected] 
+1

Кстати, поскольку это помечено как bash, а не sh, я бы подумал о том, что «sed ... <<<» mburkhar @ tech.com ", а не' echo "[email protected]" | sed ... '; немного меньше накладных расходов. –

+0

@CharlesDuffy я не знаю <<< до сих пор :) и это пример для копирования пасты в терминал чтобы увидеть, что команда работает (или нет). –