2011-12-11 4 views
2

sed를 사용하여 그룹 일치를 수행하려고합니다.sed 그룹 일치

는 기본적으로 나는 이런 식으로 뭔가가 :

func_name(4234,43543,76,1) 

을 그리고 함수의 매개 변수와 일치해야합니다 당신이 원하는 경우

$ echo 'func_name(4234,43543,76,1)' | sed -n 's/\([0-9][0-9]*\).*/\1 /p' 
func_name(4234 

$ echo 'func_name(4234,43543,76,1)' | sed -n 's/\([[:digit:]]+\).*/\1 /p' 
<empty> 

$ echo 'func_name(4234,43543,76,1)'| sed -n 's/.*\([0-9][0-9]*\).*/\1 /p' 
1 
+0

당신은 얼마나 많은 매개 변수를 알고 계십니까? '34 + 45'와 같은 표현식을 처리해야합니까? 'func_name (abs (b), sqrt (c), hypot (sqrt (d * e + f * g), abs (h-4)), 1)'같은 중첩 괄호를 처리해야합니까? –

+0

4 개의 매개 변수, 부호없는 정수 –

+0

OK : 고정 된 알려진 수의 간단한 인수는 비교적 간단합니다. 괄호가없는 표현은 단지 약간 더 어렵습니다. 인수 목록에 쉼표가있는 중첩 된 괄호는 완전히 다른 볼 게임이며 정규 표현식을 사용하여 시도하지 않습니다. –

답변

6

당신은 매개 변수의 수를 알고 그들은 (따라서 중첩 된 괄호없이 임베디드 쉼표 중 하나) 그 다음, 항상 '간단한'없는 경우 : 전에이 쉼표 후에 공간을 견디는 것을

echo "func_name(4234,53543,76,1)" | 
sed 's/.*(\([^,)]*\),\([^,)]*\),\([^,)]*\),\([^,)]*\))/a1 \1; a2 = \2; a3 = \3; a4 = \4/' 

주 (그리고 그들도 - 그러나 당신은 전에 공간을 남기지 않을 것입니다, 그렇지 않습니까?).

매개 변수가 간단한 부호없는 정수이고, 당신은 아마도, 함수 이름을 알고있는 경우 또는

:

echo "func_name(4234,53543,76,1)" | 
sed 's/func_name(\(\([0-9]*\), *\([0-9]*\), *\([0-9]*\), *\([0-9]*\)\))/args = \1/' 
:

echo "func_name(4234,53543,76,1)" | 
sed 's/func_name(\([0-9]*\), *\([0-9]*\), *\([0-9]*\), *\([0-9]*\))/a1 \1; a2 = \2; a3 = \3; a4 = \4/' 

는 한 번의 매치에서 모든 매개 변수를 얻으려면, 당신은 중첩 된 그룹을 할 필요가

이제 \2 .. \5은 여전히 ​​별도의 인수를 참조합니다.

echo "func_name(4234,53543,76,1)" | 
sed 's/func_name(\(\([0-9]*\)\(, *\([0-9]*\)\)\{3\}\))/args = \1/' 

이 첫 번째 후 인수를 찾기 위해 반복 제어 \{3\}를 사용합니다.

+0

그래, 나도 알아,하지만 난 단지 하나의 그룹으로 해결할 수 있다고 생각하고 \ 1 \ 2 \ 3 \ 4 얻을 루프에서 반복. –

+0

쉼표와 일치하기 때문에 마지막 하나도 맞지 않습니다. –

+0

지난 두 사람 모두 나를 위해 일했습니다 ... 그러나 나는 그 (것)들에 쉼표를 포함하기를 기대하고있었습니다. 단일 캡처에서 인수를 원한다면 쉼표를 포함해야합니다. 4 개의 별도 인수가 필요하면 4 개의 별도 캡처를 요청해야합니다. –

-1

이 옵션 -r를 사용하여을 (정규 표현식에게 옵션을 확장) 문자 클래스 [[:digit:]]을 사용하십시오.

1
echo 'func_name(4234,43543,76,1)' | cut -d "(" -f2 | sed 's/[,)]/ /g' 
1

이 당신을 위해 작동 될 수 있습니다 더 자세하게

echo 'func_name(4234,43543,76,1)' | sed 's/[^0-9,]//g;y/,/ /' 
4234 43543 76 1 

또는를 :

echo 'func_name(4234,43543,76,1)' | 
sed 'h;s/[^0-9,]//g;y/,/\n/;x;s/(.*/ parameters are:/;G' 
func_name parameters are: 
4234 
43543 
76 
1