1 (08.10.2010 18:08:39 отредактировано ufomen)

Всем привет,
есть список IP вида:

# cat /tmp/mail2
123.25.64.6.smtp > 92.45.59.112.58101
92.45.59.112.58101 > 123.25.64.6.smtp
123.25.64.6.smtp > 92.45.59.112.58101

пытаюсь sed рубануть все с конца строки до первой точки:

cat /tmp/mail2 |sed 's/\..*$//'

По идее
$ знак конца строки,
.* - любые символы в любом кол-ве
\. экранированный знак точки

Тоесть  это как-бы должно значить "заменить все с конца стоки (с права на лево) до первой найденной - точки ничем"

НО на выходе получаю

123
92
123

Почему оно заменяет все до последней встретившейся точки если считать с конца строки?

С sed опыта мало, погуглил но не пойму почему оно ТАК работает.

2

sed 's/\.\[^.\]*$//'

3 (07.10.2010 21:50:23 отредактировано mycetophylax)

CyberDaemon пишет:

sed 's/\.\[^.\]*$//'

Попробывал, у меня Ваша конструкция выводит неизмененный список:

# cat /tmp/mail2 |sed 's/\.\[^.\]*$//'
123.25.64.6.smtp > 92.45.59.112.58101
92.45.59.112.58101 > 123.25.64.6.smtp
123.25.64.6.smtp > 92.45.59.112.58101

P.S.

# cat /etc/issue
CentOS release 4.8 (Final)
Kernel \r on an \m

# rpm -q sed
sed-4.1.2-7.el4

4 (08.10.2010 18:13:57 отредактировано ufomen)

Ну в общем решил сам но не без помощи ))

Варианты:

awk -F'.' '{print $1"."$2"."$3"."$4}'

sed -s "s/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)\(\.[0-9]*\)/\1/"

sed -s "s/\(.*\)\(\..*$\)/\1/"

Мде, регулярки учить нужно...

P.S. Как поставить РЕШЕНО не знаю )

5

ufomen пишет:

По идее
$ знак конца строки,
.* - любые символы в любом кол-ве
\. экранированный знак точки

Тоесть  это как-бы должно значить "заменить все с конца стоки (с права на лево) до первой найденной - точки ничем"

всё верно. гуглите на тему "жадность звёздочким в sed". звёздочка пожирает не до первой, а всё, что сможет - точка == любой символ, в том числе и точка. Вот она у вас всё и пожрала. Ибо жадная.

ищите не "любой символ", а "любой кроме точки":

 Консоль:
$ echo "123.25.64.6.smtp > 92.45.59.112.58101" | sed 's/\.[^.]*$//'
123.25.64.6.smtp > 92.45.59.112

можно подойти к проблеме с другой стороны: пусть звёздочка жадная, заставим её жрать все точки, кроме одной! и выделим то, что пожрётся:
 Консоль:
$ echo "123.25.64.6.smtp > 92.45.59.112.58101" | sed -r 's/(.*)\..*/\1/'
123.25.64.6.smtp > 92.45.59.112

тут 2 звёздочки, регулярка работает слева-направо, потому первая звёздочка жрёт всё, кроме одной точки (мы её явно указали). Это последняя точка, т.к. звёздочка жадная. Второй звёздочке точек уже не достанется.

ufomen пишет:

Мде, регулярки учить нужно...

а то!?
то, что вы написали, хоть и работает, но слишком много лишнего...

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)