LINUX.ORG.RU

Помощь по sed + regex

 ,


0

1

Друзья, есть строка вида 40|0, мне нужно взять любое первое значение до символа |. Регулярка получилась такая: ^[ \d]* Как её скормить sed-у не понимаю.... делаю так:

echo "30|0" | sed -e '/^[ \d]*/g'

В ответ получаю пустую строку. ЧЯДНТ?

Ответ на: комментарий от RenardL

Это ломает мне мозг, а что нельзя использовать просто регулярные выражения? Или у него они свои всегда и навсегда? Спасибо большое, вы сделали мой день!

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

Это ломает мне мозг, а что нельзя использовать просто регулярные выражения?

А это просто регулярное выражение.

А вот что ты хотел сделать, не понятно. Во-первых, \d нет в POSIX регулярках, ни обычных, ни extended. Во-вторых, твоя регулярка матчит любую строку из-за *. В-третьих, g заменяет строку на содержимое hold space, т.е. пустую строку.

slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 1)
echo '30|0' | cut -d'|' -f1        # with cut
echo '30|0' | sed -re 's/\|.*$//g' # with sed
algamest ()
Ответ на: комментарий от algamest

echo '30|0' | cut -d'|' -f1 # with cut

Ну тогда уж на shell, без всяких внешних процессов и гарантией, что точно есть «|...»:

while IFS='|' read n1 l; do [ -n "$l" ] && echo "$n1"; done

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

В таких задачах невозможно избежать perl! Сделать лучше менее очевидным способом.

$ echo '30|0' | perl -F'\|' -pale '$_ = $F[0]'
30
anonymous ()
sed -e 's/|.*//'


Но тут уместней cut:

echo '30|0' | cut -d'|' -f1

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