sed / awk + считать символ до соответствующего символа - PullRequest
1 голос
/ 30 июня 2010

Дорогие друзья

У меня есть следующее:

   PARAM=1,2,3=,4,5,6,=,7#,8,9

Как посчитать с помощью sed / awk четного символа "=" между PARAM до символа "#"

Например

 PARAM=1,2,3=,4,5,6,=,7#,8,9

Тогда sed / awk должен вернуть 3

OR

 PARAM=1,2,3=,4=,5=,6,=,7#,=8,9

Тогда sed / awk должен вернуть 5

THX

Яэль

Ответы [ 2 ]

1 голос
/ 01 июля 2010

вы можете использовать этот лайнер. Не нужно использовать split() как в ответе. Просто используйте gsub (). Он вернет счет того, что заменено. Кроме того, установите разделитель полей на «#», так что вам нужно иметь дело только с первым полем.

$ echo "PARAM=1,2,3=,4,5,6,=,7#,8,9" | awk -F"#" '{print gsub("=","",$1)}'
3
$ echo "PARAM=1,2,3=,4=,5=,6,=,7#,=8,9" | awk -F"#" '{print gsub("=","",$1)}'
5
0 голосов
/ 30 июня 2010

Вот скрипт awk, который находит число, используя разделители полей / split. IT устанавливает разделитель полей на символ #, а затем разбивает первое слово (материал слева от первого # на символе =. Возможно, странный подход, но это один метод. Обратите внимание, что он предполагает = символов слева от параметра. Если это неверное предположение, это не сработает.

BEGIN{ FS="#" }
/PARAM.*#/{
   n = split( $1, a, "=" );
   printf( "Count = %d\n", n-1 );
}

Это можно сделать и одной строкой:

[]$ export LINE=PARAM=1,2=3,4=5#=6
[]$ echo $LINE | awk 'BEGIN{FS="#"}/PARAM.*#/{n=split($1,a,"="); print n-1;}' 
3
...