LINUX.ORG.RU

[awk] match all

 


0

1

Чего-то я не нашёл в мануале awk аналога preg_match_all из PHP.

Т.е нахождение всех подходящих строк, а не только первого.

Можно ли сделать это в awk без применения других програм (egrep) ?

мне даже любопытно как вы на awk смогли вывести только первую строку

%>echo -e 'Hello\nHelo\nMullo\nPello\nFellow' | awk '/ell/'            
Hello
Pello
Fellow

%>echo -e 'Hello\nHelo\nMullo\nPello\nFellow' | awk '/ell/ || /ul/'                                                                            
Hello
Mullo
Pello
Fellow

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

Тогда уточню.

В твоём случае находятся сами строки в которых наличиствует подстрока.

Мне же нужно найти и вывести все найденные слова (последовательности символов) которые подходят моему регулярному выражению.

Т. е. я ищу аналог команды

$ echo blablabla | egrep -o [^a]+
bl
bl
bl
на языке awk.

У меня одна очень длинная строка. А не множество строк.

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

Как я понял «output separator» лишь форматирует вывод. А у мне нужно вначале найти особые последовательности символов.

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

man awk

match(s, r [, a]) Returns the position in s where the regular expression r occurs, or 0 if r is not present, and sets the values of RSTART and RLENGTH. Note that the argument order is the same as for the ~ operator: str ~ re. If array a is pro‐ vided, a is cleared and then elements 1 through n are filled with the portions of s that match the corresponding parenthesized subexpression in r. The 0'th element of a contains the por‐ tion of s matched by the entire regular expres‐ sion r. Subscripts a[n, «start»], and a[n, «length»] provide the starting index in the string and length respectively, of each match‐ ing substring.

sdio ★★★★★
()

Сделал код с циклом do while.

$ echo ooo12345oooooooo2010oooooooooo567 | awk -f match_all.awk

12345
2010
567

match_all.awk :

{

    s=$0

    regex = "([[:digit:]]+)"

    do
        {
        
        match (s, regex, arr)
        
        if (arr[1] == NULL)
            exit        
        
        p = substr ( s, arr[1, "start"], arr[1, "length"] )
        print p
        
        s = substr ( s, arr[1, "start"] + arr[1, "length"] )
        
        }
    
    while (1 == 1)
}

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

1) Потому что хотелось узнать все возможности Awk.

2) Grep это дополнительная программа.
Обработку строк хотелось сделать наименьшим количеством програм.

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

ну так перепиши всю обработку на С :) будет одна очень быстрая программа :)

xydo ★★
()

Ты не понимаешь, как устроен awk. Тебе нужен не awk, а grep

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