LINUX.ORG.RU

Вопрос про sed и его жадность

 ,


0

2

Или про жадность регулярных выражений. Чтение мануала не вдохновило, гуглинг не помог.

Что имеется: строка WM_CLASS(STRING) = «xterm», «UXTerm»
Что требуется: вырезать из этой строки xterm и UXTerm

/Убирать все лишние символы, и втыкать awk, — не интересно. Разделить сразу эту кашу на две части (до запятой и после) — тоже/

Я хочу вырезать подстроку «xterm», «UXTerm». Делаю так:

sed -r 's/^.*((\").+\2)$/\1/g'
То есть всё лишнее, что вокруг подстроки, вырезается, а вставляется подстрока. Не помогает. Из-за прожорливости вырезается «UXTerm». Делаю так:
sed -r 's/^.*?((\").++\2)$/\1/g'
Результат снова неизменный. Здесь уже мне это показалось странным, я решил написать сюда, спросить: как регулировать прожорливостью при использовании sed?

Задачу можно решить иначе: вырезать от начала строки до первого символа \", но опять же — жадность.

★★

Последнее исправление: kalterfive (всего исправлений: 1)
echo 'WM_CLASS(STRING) = «xterm», «UXTerm»'| sed -r 's/.*("xterm").*("UXTerm")/\1\2/'
javaQest
()
$ echo 'WM_CLASS(STRING) = "xterm", "UXTerm"' | sed -r 's/[^"]*"([^"]+)"/\1/g'
xtermUXTerm
salsa
()
Ответ на: комментарий от javaQest

Спасибо, кажется это то что нужно. Вообще, я думал что управление жадностью в sed есть на уровне регулялок (как я выше показал с .*? и .++), но ладно.

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

KISS ;)

echo 'WM_CLASS(STRING) = "xterm", "UXTerm"' | awk -F'"' '{print $2, $4}'
beastie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.