2012-03-26 4 views
10

파일의 각 줄을 반복하고 ${으로 시작하고 }으로 끝나는 편지를 찾아서 추출하려고합니다. 따라서 최종 결과물 인 SOLDIRTEMP (inputfile.sh) 만 예상됩니다.sed/regex를 사용하여 같은 줄에서 여러 번 추출합니다.

다음 스크립트를 사용해 보았지만 두 번째 패턴 인 패턴 TEMP 만 일치하는 것으로 보입니다. 나는 또한 끝에 g를 추가하려했지만 도움이되지 않습니다. 아무도 나에게 일치하는 방법을 알려 주시기 바랍니다/둘 다 추출/같은 줄에 여러 사건?

inputfile.sh :

. 
. 
SOLPORT=\`grep -A 4 '\[LocalDB\]' \${SOLDIR}/solidhac.ini | grep \${TEMP} | awk '{print $2}'\` 
. 
. 

script.sh : 이것은 (단지 특정 입력 라인 어쩌면하지만) 당신을 위해 작동 할 수

infile='inputfile.sh' 
while read line ; do  
    echo $line | sed 's%.*${\([^}]*\)}.*%\1%g' 
done < "$infile" 

답변

9

grep 솔루션?

grep -oP '(?<=\${).*?(?=})' 

그것은 펄 스타일 lookaround assertions를 사용하고 유유히 '${''}' 사이의 모든 항목과 일치합니다.

그것에 당신의 라인을 먹이, 나는

$ echo "SOLPORT=\`grep -A 4 '[LocalDB]' \${SOLDIR}/solidhac.ini | grep \${TEMP} | awk '{print $2}'\`" | grep -oP '(?<=\${).*?(?=})' 
SOLDIR 
TEMP 
+1

TIL에 대한'grep -P', 감사합니다. –

+0

매우 유용합니다. 감사! – noumenon

2

:

sed 's/[^$]*\(${[^}]\+}\)[^$]*/\1\t/g;s/$[^{$]\+//g' 
+0

효과가있었습니다. 감사. – user1292603

+0

그런 경우 대답을 수락하는 것이 좋습니다. –

0

나는 그것이있을 거라고 생각대로 나오지만큼 나쁘지 않다 사용하여 한 줄에서 여러 경기를 추출 수,하지만 여전히 상당히 난해한 읽기가 어렵다 :

$ echo 'Hello ${var1}, how is your ${var2}' | sed -En ' 
    # Replace ${PREFIX}${TARGET}${SUFFIX} with ${PREFIX}\a${TARGET}\n${SUFFIX} 
    s#\$\{([^}]+)\}#\a\1\n# 
    # Continue to next line if no matches. 
    /\n/!b 
    # Remove the prefix. 
    s#.*\a## 
    # Print up to the first newline. 
    P 
    # Delete up to the first newline and reprocess what's left of the line. 
    D 
' 
var1 
var2 

그리고 한 줄에 모든 : POSIX는 정규 표현식에 확장 때문에

sed -En 's#\$\{([^}]+)\}#\a\1\n#;/\n/!b;s#.*\a##;P;D' 

non-greedy 한정 기호를 지원하지 않거나 줄 바꿈 식에 줄 바꿈 문자를 넣지 마십시오. 줄 바꿈 대신 끝에 BEL 문자 (\a)를 접미사로 사용했습니다. 개행을 사용할 수는 있지만 두 번째 대체는 의심스러운 s#.*\n(.*\n.*)##이어야합니다. 이는 정규식 엔진에 의한 병적 인 양의 백 트랙킹을 포함 할 수 있습니다.

관련 문제