2013-02-08 3 views
2

분명히 sh 스크립트를 포팅합니다. sed의 GNU 구현을 사용하여 sed의 BSD 구현에 작성되었습니다. 원래 주석으로 스크립트의 정확한 라인은 다음과 같습니다

ext=.h; ext="$(echo $ext | sed 's/\./\\./' -)"; echo [$ext] 

사용 : 나는 (분명히 내가 ext에 대한 모든 가능성 값을 소진하고 있지 않다) 다음과 같이 결과를 재현 할 수 있어요

# escape dot in file extension to grep it 
ext="$(echo $ext | sed 's/\./\\./' -)" 

sed의 GNU의 구현은 다음과가 반환됩니다

[\.h] 

sed FOL의 BSD의 구현을 사용하여 lowing이 반환됩니다

sed: -: No such file or directory 
[] 

sed 모두 구현 ext=.h; ext="$(echo $ext | sed 's/\./\\./')"; echo [$ext] 반환을 [\.h] 실행.

GNU와 BSD의 sed의 매뉴얼 페이지에서 후미 "-"에 관한 내용을 찾지 못했습니다. "-"로 sed을 검색하는 것은 그다지 효과적이지 않습니다.

"-"는 오타입니까? 예기치 않은 값인 $ext에 대해 "-"가 필요합니까? 문제가 sed이 아닌 sh입니까?

"-"의 목적이 무엇인지 설명하거나 더 잘 설명해야하는 사람이 나를 안내 할 수 있습니까?

내 시스템에서
+1

에 체크 아웃 : http://stackoverflow.com/questions/8045479/whats-the-magic -of-a-dash-in-command-line-parameters –

답변

1

, 그 구문은 매뉴얼 페이지에 문서화되어 있지 않습니다,하지만 '정보'페이지에 있습니다

나오지 옵션 ... [SCRIPT] [INPUTFILE ...]

INPUTFILE을 지정하지 않거나 INPUTFILE이 -', 인 경우 ' 은 표준 입력 내용을 필터링합니다.

특정 사용법을 감안할 때 나는 '-'을 생략 할 수 있으며 은 여전히 ​​작동해야한다고 생각합니다.

0

귀하의 특정 질문에 답변 해 주셨지만 귀하의 스크립트는 모두 잘못되었습니다. 이것 좀보세요 :

# escape dot in file extension to grep it 
ext="$(echo $ext | sed 's/\./\\./')" 

주요 문제를 그것과 같습니다

  1. 당신은 당신의 변수 ($ 내선)를 인용하지 않는 그래서이 포함되어있는 경우이 파일 이름 확장을 통해 이동을 더한 것 공간은 여러 인수 대신 1. 대신이 작업을 수행 에코 전달됩니다

    ext="$(echo "$ext" | sed 's/\./\\./')" 
    
  2. 당신은 쉘이 하찮게 할 수있는 일을 수행하는 외부 명령 (나오지도)와 파이프를 사용하고 있는지 그 자체.대신이 작업을 수행합니다 :

    ext="${ext/./\.}" 
    
  3. 모두의 최악의 : (.) ​​당신이 그것에 방금 검색을 수행 grep을 위해 전달할 수 있도록이 인 것처럼 당신은 당신의 변수에 RE 메타 문자를 탈출하고 string - 변수가 RE 메타 문자의 조합을 포함 할 수있는 일반적인 경우에는 의미가없고 다루기 힘들어집니다. RE 검색 대신 문자열 검색 만하면 아무 것도 탈출 할 필요가 없습니다. 위의 대체 명령 중 하나를 수행 한 후 다음 중 하나를 대신 grep "$ext" file하지 마십시오

    grep -F "$ext" file 
    fgrep "$ext" file 
    awk -v ext="$ext" 'index($0,ext)' file 
    
+0

그의 스크립트는 괜찮습니다. #1. 아마도 ext는 문제가되는 문자를 가지지 않습니다 (확장 기능 일 가능성이 있습니다). # 2. 아니! 그것은 POSIX (bash-only)가 아닙니다. #삼. fgrep/grep-F는 이식성이 떨어지고 런타임 감지가 필요합니다 (autoconf의 AC_PROG_FGREP 참조). 그들 사이에 선택해야하는 코드를 작성하려고합니까? OP는 명시 적으로 이식 가능한 쉘 스크립트를 작성하고 bash는 전혀 언급하지 않으므로 휴대용 구조를 bashism으로 바꾸라고 말해야합니까? –

+0

@NicholasWilson - # 1 - 일반적인 문제에 부딪히지 않기를 바라는 것은 문제를 허용하지 않는 스크립트를 쉽게 작성할 수있을 때 우습다. # 2 - 올바른, 그 구조는 모든 쉘에서 지원되지 않습니다. 쉘에서 지원되지 않으면 외부 도구와 파이프를 호출하는 것보다 더 나은 작업을 할 수 있습니다. # 3 fgrep/grep -F는 절대적으로 훌륭하지만, 만약 당신이 그들과 상반되는 것을 가지고 있다면, aws 대안을 사용하십시오. 모든 3 가지 대안은 중요하지 않은 RE를 대신하여 문자열을 검색하고, 점 2를 다룰 필요성을 제거합니다. –

+0

@NicholasWilson - Chris Johnson (http://www.amazon.com/Shell-Scripting-Recipes-Problem-Solution-Approach/dp/1590594711)의 "Shell Scripting Recipes : A Problem-Solution Approach"책을 가져 오는 것이 좋습니다.)를 사용하면 문제를 이해하는 데 도움이됩니다. –