LINUX.ORG.RU

sed. регулярные выражения

 , , ,


0

1

Всем привет. Вообщем задача такая. Нужно отрезать от слова «naprimer» все буквы кроме первой, то бишь «n», все кроме второй (a) и все кроме последней (r). Я добился немного другого результата..)) # echo naprimer | sed 's/^.//g' aprimer Отрезает первую букву.. Мммда.. не совсем то что нужно) Подскажите как отрезать нужные буквы? С regexpam'i не дружу..



Последнее исправление: cetjs2 (всего исправлений: 1)

Это три разные задачи? Или одна и должен быть ответ «nar»?

И да, лабораторки надо самому делать =)

observer ★★★
()
Последнее исправление: observer (всего исправлений: 1)
Ответ на: комментарий от observer

ахаха.. это не лабораторка) я линукс начал изучать) мозг уже кипит непрерывно и глаза красные) задача научиться отрезать от слова нужные буквы. Буду признателен за обьяснения как это сделать.. Гуглил, не нашел ничего такого. Если не получится так, то через массив буду делать..

antyvirus
() автор топика

Не до конца понял задачу, но среди этого явно есть то, что тебе нужно:

$ echo "naprimer" | sed 's/\(.\).*/\1/g'
n
$ echo "naprimer" | sed 's/\(..\).*/\1/g'
na
$ echo "naprimer" | sed 's/\(...\).*/\1/g'
nap
$ echo "naprimer" | sed 's/.\(.\).*/\1/g'
a
$ echo "naprimer" | sed 's/..\(.\).*/\1/g'
p

Kroz ★★★★★
()

Да, и для такой простой задачи, я бы пользовался встроенными средствами bash:

$ A="naprimer" ; echo "${A:0:1}"
n
$ A="naprimer" ; echo "${A:0:2}"
na
$ A="naprimer" ; echo "${A:0:3}"
nap
$ A="naprimer" ; echo "${A:1:1}"
a
$ A="naprimer" ; echo "${A:2:1}"
p

Kroz ★★★★★
()
Ответ на: комментарий от antyvirus
echo 'testtesttest' | sed 's/^\(..\).\(.*\)$/\1\2/i';

Вот пример устранения третьего символа.

Структура: s/заменяемая строка/результат/i

^ - начало строки

$ - конец

() - запоминание в переменную, скобки нужно экранировать \

. - один любой символ

.* - любое число любых символов

\1 и \2 - извлечение данных которые запомнили в левой части регекспа с помощью скобок

observer ★★★
()
Последнее исправление: observer (всего исправлений: 2)
Ответ на: комментарий от Kroz

вооот!! то что нужно. первая, вторая буквы есть! А можно в кратце объяснить что за что отвечает при обрезке? И как последнюю букву с конца оставить?

antyvirus
() автор топика

Спасибо всем.. Чуть чуть прибавилось знаний в мозгу)

antyvirus
() автор топика
Ответ на: комментарий от antyvirus

А можно в кратце объяснить что за что отвечает при обрезке?

Это не обрезка, а замена.
Начал было отвечать, да увидел, что observer уже все объяснил: sed. регулярные выражения (комментарий)

Если что непонятно - спрашивай.

Kroz ★★★★★
()

Это всё было частью великого замысла. Я скрипт пишу по созданию учёток на почтовом сервере. У пользователей емайлы вида имя.фамилия@домен.ру, а пароли у всех «ифмаяя».

# Генерация пароля ename=`echo $EMAIL | sed 's/\..*//g'` efamilia=`echo $EMAIL | sed 's/.*\.//g'` p1=`echo $ename | sed 's/\(.\).*/\1/g'` p2=`echo $efamilia | sed 's/\(.\).*/\1/g'` p3=`echo $ename | sed 's/.\(.\).*/\1/g'` p4=`echo $efamilia | sed 's/.\(.\).*/\1/g'` p5=`echo $ename | sed 's/.*\(.\)$/\1/g'` p6=`echo $efamilia | sed 's/.*\(.\)$/\1/g'` PASS=$p1$p2$p3$p4$p5$p6

Как то так)

antyvirus
() автор топика
Ответ на: комментарий от antyvirus

Баг: в такой постановке, если e-mail вида «name.surname@domain.com» в качестве фамилии у тебя будет «com» - то, что после последней точки.

И потом; не легче ли конструкцию типа

p3=`echo $ename | sed 's/.\(.\).*/\1/g'` 
заменить на
p3="${ename:1:1}"
?

http://www.opennet.ru/docs/RUS/bash_scripting_guide/x4171.html , параграф «Извлечение подстроки»

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Сегодня ты делаешь за них домашку на ЛОРе, а завтра тебе в наследство передадут загаженный кластер ветхозаветного периода.

Deleted
()
Ответ на: комментарий от Deleted

Что-что, кто сказал, фобос-в-грунт?

anonymous
()
Ответ на: комментарий от Kroz

В переменную $EMAIL попадает только часть без домена. Имя фамилию я сам выделил в разные переменные, а вот с буквами затык был.

antyvirus
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.