LINUX.ORG.RU

Найти слово между между '] ' и следующим пробелом

 , ,


0

3

Разбираю в bash скрипте примерно такие строки:

[+] FIRST TEXT
[ ] SECOND TEXT

Как красиво найти слова FIRST и SECOND (т.е. слово между '] ' и следующим пробелом)?

Для первой строки работает awk '{print $2}', а для второй строки нужно уже awk '{print $3}'.

Там вам на Баше или АВКе? В любом случае, просто срежьте первые четыре символа, а уже остальное разбирайте по разделителям.

На Баше:

#!/bin/bash

while read line; do
    read num __ <<< "${line:4}"
    echo "$num"
done

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
sed -e 'y/[+]/   /;s/^ *//;s/ .*$//'

не оч красиво, но работать будет

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

В твоём варианте символов больше. (=

Хотя, на результат это не влияет, поэтому не имеет значения. Вообще, мне нравится sed за то, что с его помощью можно добиться любых результатов целой пачкой способов на каждый.

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

Да всегда пожалуйста. Но если удобнее именно на АВКе, то тоже можно, разумеется:

#!/usr/bin/gawk -E

{
    $0 = substr ($0, 5);
    print $1;
}
Zmicier ★★★★★
()
Ответ на: комментарий от romychvk

самый красивый способ

Самый понятный, если быть точным. Но с малейшим изменением задачи скрипт будет сильно изменяться, а ещё это лишняя сущность при пакетной обработке данных. К счастью bash присутствует во всех дистрибутивах.

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

Под красивым я понимаю а) минималистичный; б) совместимый; в) понятный.

Т.е. самый короткий способ на чистом баше выглядит самым желательным.

sed - это дополнительная сущность, плюс зубодробительные заклинания для простейшей, казалось бы, задачи.

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

Я дико извиняюсь, не могли бы вы объяснить синтаксис:

read num __ <<<

Не понимаю, как это работает.

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

минималистичный

Тут sed всегда выигрывает, а если нет, то проигрывает только перлу.

совместимый

А с чем не совместим sed?

понятный

Вот тут sed проигрывает с точки зрения новичков. Но если один раз освоишь регулярки, потом тебя за уши не оттащат. Я и vim попробовал из-за них, и теперь не представляю замену без подобных регулярок.

read num __ <<<
Не понимаю, как это работает.

понятный

Ага, ага.

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

В данном случае да, но в общем у меня разные.

beastie ★★★★★
()

Для первой строки работает awk '{print $2}', а для второй строки нужно уже awk '{print $3}'.

awk '{print $(NF-1)}'  — второе с конца поле

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

Твой вариант «жадный», мой нет

Твой вариант нежадный только частично. Вот полностью нежадный вариант

sed -r 's/[^]]*] ([^ ]+)[^$]*/\1/' file

somequest
()

grep -o '[[:alpha:]][^ ]*' | head -1

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

понятный

Вот тут sed проигрывает с точки зрения новичков. Но если один раз освоишь регулярки, потом тебя за уши не оттащат. Я и vim попробовал из-за них, и теперь не представляю замену без подобных регулярок.

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

Причем каноничный перловый регэксп выглядит вполне неплохо:

/]\s+(S+)/

А в sed он становится монстрообразным.

read num __ <<<
Не понимаю, как это работает.
понятный

Ага, ага.

Ну да. С таким синтаксисом я не сталкивался. В принципе, регэксп для sed я бы и сам написал, я искал вариант поэлегантнее.

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