2011-09-27 3 views
0

나는 하나의 인수를 취하고 함수 이름이 f 인 bash say parse에 함수가있다. 처리 될 내 파일 I가 제 제외한 모든 함수 f를 적용이다Bash에서의 스크립팅

[email protected](b)@f(c)@ 
[email protected](d)@f(e)@f(g)@ 
[email protected](n)@ 
[email protected] 

로 출력을 제공 할 정도

[email protected]@[email protected] 
[email protected]@[email protected]@ 
[email protected]@ 
[email protected] 

같다. 모든 단서 그래서 내가 어떻게 할 수 있습니까?

답변

1

아마도 이것이 원하는 것입니까?

kent$ cat sqr.sh 
#!/bin/bash 
echo $(($1*$1)) 

지금 당신은 당신의 입력에 위의 기능을 적용 할 :)이 (F @ t에 저를주고 @ t에 대한

kent$ echo "[email protected]@[email protected]@ 
[email protected]@[email protected] 
[email protected]"|awk -F'@' -v [email protected] '{for(i=2;i<=NF;i++) if($i) "./sqr.sh "$i|getline $i; print}' 

[email protected]@[email protected]@ 
[email protected]@[email protected] 
[email protected] 
+0

이것은 charm처럼 작동했습니다. $ i에 공백이 있으면 몇 가지 나쁜 일을합니다. "./sqr.sh $ i" , "./sqr.sh $ {i}", "./sqr.sh" "$ i", "./sqr.sh" "$ {i}"그러나이 작업이 수행되지 않았습니다. – w2lame

+0

다음 공백을 스크립트에 전달하기 전에 공백을 사용하십시오 (예 : sqr.sh). – Kent

+0

그러나 처리해야 할 특수 문자가 많이 있습니다 .. 어쨌든 덕분에 많이 :-) – w2lame

1

당신은 나오지도 사용할 수 있습니다

sed -e 's/@\(.\)/@f(\1)/g' 
+0

을 그리고 내가 가진 당신은 스크립트라는 sqr.sh이 값에 함수를 적용하고 명령문을 인쇄하지 않습니다. 함수가 x를 취하는 사각형이라면 x^2의 값을 출력해야합니다. – w2lame

+1

그 결과가 보이지 않습니다 :'$ echo "t @"| sed -e 's /@\(.\)/@f (\ 1)/g''이 결과로 "t @"를줍니다. –

+0

결과를 평가할 필요가있는 경우 (그리고 올바른 bash 인 경우) 출력을 실행하려면 $ (...)로 간단하게 묶을 수 있습니다. –

3

이 그것을 수행해야합니다 모든 필드는 하나의 문자가있는 경우

sed 's/@\([^@]*\)/@f(\1)/g' 

, 당신은 그것을 조금 단순화 할 수 있습니다 (예를 들어, \([^@]*\)보다는 .를 사용하여).

+0

t @ 때문에 t @ f() 을주고 있습니다. 그리고 값에 함수를 적용하고 문을 출력하지 않아야합니다. 함수가 x를 취하는 사각형이라면 x^2의 값을 출력해야합니다. – w2lame

1
awk 'BEGIN {OFS=FS="@"} {for (i=2; i<=NF-1; i++) $i="f("$i")"; print}' 
+0

query ='echo "ab @ cd @ ef %%%"| awk 'BEGIN {OFS = FS = "@"} {for (i = 2; i <= NF-1; i ++) i = $ (func $ i); print} '' 이것은 터미널에 걸려 있거나 (왜 그럴지 모르지만 입력을 기다립니다). 요소에 f 함수를 적용하고 출력에 출력하지 않고 싶습니다. – w2lame

+0

질문이 명확하지 않습니다. 함수는 어디에 정의되어 있습니까? awk/shell/...에서? '$()'는 bash가 아닌 쉘 구문입니다. awk의 경우,'system()'을 사용해야 할 것입니다. –