2012-10-04 4 views
1

나는 유닉스 컴퓨터에서 C 코드를 검색하기 위해 bash 쉘 스크립트 (많은 경험이없는 것)를 작성하려고합니다. ssh를 통해. 나는 물론 실제로 문자 그대로이 검색 아니에요, 내 검색 문자열을 표현하기 위해 사용하는 것을 단지입니다"디버깅"bash 셸 스크립트 : 문자를 이스케이프하여 인수 전달

#! /bin/bash 

find . \(-name '*.c' -o -name '*.h' \) -exec grep -n '<SEARCH_STRING>' {} + | sed -e "s/^\(\..*\.c\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" | sed -e "s/^\(\..*\.h\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" | sed ''/<SEARCH_STRING>/s//`printf "\033[31m<SEARCH_STRING>\033[0m"`/'' | less -R 

참고 :

내 스크립트 코드입니다.

나는 이것에 몇 가지 문제가 있음을 알고 있습니다. 우선, 맨 아래 줄 (#!/bin/bash 헤더없이 "스크립트")을 명령 줄에 입력하면 실제로 제대로 작동하고 원하는 결과를 얻을 수 있습니다. 나는 bash는 스크립트에 그것을 할 때 내가 특정 문자를 이스케이프해야한다고 알고 있지만, 나는 몇 가지 (조합) 문자를 탈출 시도하고 항상 나에게 같은 오류 제공합니다 또한

find: missing argument to `-exec' 
./code_search.sh: line 4: <SEARCH_STRING>: command not found 
sed: -e expression #1, char 43: unterminated `s' command 
printf: usage: printf [-v var] format [arguments] 
./code_search.sh: line 8: \033[31m<SEARCH_STRING>\033[0m: command not found 
sed: -e expression #1, char 46: unterminated `s' command 

을, 나는 shouldn 실현 검색 문자열을 내 스크립트에 하드 코딩하지 마십시오. 검색 문자열을 매개 변수로 스크립트에 제공하는 것이 훨씬 편리하기 때문에 실제로 어떻게해야하는지 알 수 없습니다.

내가 말했듯이 나는 bash 스크립트를 작성하는 데 많은 경험이 없기 때문에이 스크립트를 작성하여 코딩 작업을 도와 주려고했다. 그러나, 나는 상사가 저에게 지불하는 것이 아니기 때문에 더 이상이보고 디버깅에 시간을 할애 할 수 없습니다. 나는 동료들에게 물어 봤지만 그들 중 누구도 나를 도울 수는 없다.

나는 bash 쉘 스크립팅에 대해 더 많은 것을 배우기 위해 약간의 노력을 기울이지 않는다는 것을 알고 있지만, 나는 정말로 시간을 절약 할 수 없다고 말했다. 누구든지이 스크립트를 끝내도록 도와 줄 수 있습니까?

미리 감사드립니다.

답변

0

이렇게하면 오류가 발생하지 않습니다.

#! /bin/bash 

searchstring=$1 

find . \(-name '*.c' -o -name '*.h' \) -exec grep -n "$searchstring" {} + \ 
     | sed -e "s/^\(\..*\.c\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" \ 
     | sed -e "s/^\(\..*\.h\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" \ 
     | sed ''/"$searchstring"/s//`printf "\033[31m""$searchstring""\033[0m"`/'' \ 
     | less -R 

그러나 그것이 작동한다는 의미는 아닙니다. 샘플 입력과 원하는 출력이 없으면 더 이상 당신을 도울 수 없습니다. 예를 들어, 제 3의 sed은 나에게 틀린 것처럼 보입니다.

+0

감사합니다. 샘플 입력은'./code_search.sh isValid'와 비슷하지만 샘플 출력은 입니다. /users/user/code/codefile1.c :: 15 부울 isValid, activatesCheck; /users/user/code/codefile1.c :: 321 if (!isValid) {' 그래도 실행시 오류가 발생합니다. 찾을 수있는 문제가 있습니다 : find : 경로는 expression 앞에 입력해야합니다. 사용법 : [-H] [-L] [-P] [path ...] [expression]' – user1719396

0

이것은 마지막 sed 명령에서 문자 <이 이스케이프되지 않기 때문입니다. 이중 작은 따옴표는 빈 문자열 ''을 의미하기 때문에; <이 파일 리디렉션으로 해석되면 셸은 "SEARCH_STRING"파일에서 읽으려고합니다.

sed ''/<SEARCH_STRING>/s//`printf "\033[31m<SEARCH_STRING>\033[0m"`/'' 

는 또한

sed '/<SEARCH_STRING>/s//'`printf "\033[31m<SEARCH_STRING>\033[0m"`'/' 

로 변경해야합니다, 오류 다음, 찾기 버전은 +이 경우 + functionnality에서 man find에서 명령 모양의 끝에서 수행 할 수있는 지원하지 않을 수 있습니다 xargs (파일 이름에 공백이 포함될 수있는 경우 실패 할 수 있음)

find . \(... \) | xargs grep -n '<SEARCH_STRING>' 
+0

당신의 도움에 감사드립니다! 내가 제안한 것을 (결합 및 별도로) 변경하려고 시도했지만 여전히 스크립트가 작동하지 않습니다. 내가 뭔가를 바꿀 때마다 여전히 오류가 발생합니다. find : find에 문제가 있습니다 : find : 경로 앞에 expression이 있어야합니다. 사용법 : [-H] [-L] [-P] [path ...] [expression]' – user1719396