2012-07-09 2 views
2

누군가 올바른 방향으로 나를 가리킬 수 있는지 궁금합니다. 나는 2 개의 문자열에 대한 파일을 검색하고 일치하는 경우 csv 파일에 YES를 추가하거나 그렇지 않으면 NO를 추가하려고합니다. 지금은 힘들다. 나는 아래에 나온 것처럼 발견되면 문자열을 찾아서 SUCCESS를 화면에 출력 해보고 싶다. (나는 배우기 위해 파일에 글쓰기를 시도한다.)파일에서 문자열 찾기 및 발견 된 파일에 쓰기

#/usr/bin/bash 
file=test.xml 
string1=TEST1 
string2=TEST2 
if grep -e "$string1|$string2" "$file" 
then 
    echo IT WORKS!!! 
else 
    echo UH OH!!! 
fi 
+0

할 일을 두 문자열이 나타나거나 둘 중 하나가 나타나면'YES'를 원합니까? – Sorpigal

+0

두 문자열이 모두 일치해야합니다. – abundantmussel

답변

0

,이 시도 :

file=test.xml 
string1="TEST1" 
string2="TEST2" 

if grep -q -F "$string1"$'\n'"$string2" "$file" ; then 
    printf YES 
else 
    printf NO 
fi 

중요한 -F 문자열이 정규식 특수 문자를 포함 할 일이 생기면 그들은 문자 그대로 처리된다는 것을 의미합니다. 편의상 -qgrep의 출력을 억제하므로 YES/NO 만 반환됩니다.

편집 : 당신이 일치하는 두 문자열이 필요하기 때문에

,이 시도 :

if [ $(sed -n -e "/${string1}/p;/${string2}/p" "$file" | wc -l) -ge 2 ] ; then 
    printf YES 
else 
    printf NO 
fi 

이 안전하지 않은 문자열에서 정규식 문자는 문자 그대로 처리하지되기 때문에 grep 버전이 아니라 그대로 비효율적이지만 작업이 완료됩니다.

+0

답변 해 주셔서 감사합니다. 그러나 두 문자열이 일치해야합니다. 나는 또한 질문을 업데이트 할 것이다. – abundantmussel

+0

프롬프트가 나타나기 전에 YES 또는 NO를 출력하지만 어쨌든 파일로 변경하는 것은 바람직하지 않습니다. – abundantmussel

+0

@ShellNewbie : 파일로 출력 방향을 바꾸면 추가 라인이 추가되지 않도록 일부러 새 라인을 인쇄하지 않도록했습니다. – Sorpigal

0

귀하의 코드를 좋은 방향입니다 :

내가 그렇지 않으면 결과가 있어야한다 일치로 제

나는이 지금까지 왔

을 두 문자열을해야합니까. grep이 ($string1|$string2) 사용중인 정규식을 인식하려면 -e-E으로 변경해야합니다. 당신은 또한 (즉, 조용히 -q 플래그를 사용) 실제 matchings를 나타나지 않게 할 수 있습니다 :

file=test.xml 
string1="TEST1" 
string2="TEST2" 
if grep -E -q "$string1|$string2" "$file" 
then 
    echo IT WORKS!!! 
else 
    echo UH OH!!! 
fi 

편집 : 당신은 두 문자열과 일치 할 필요 때문에, 이것은 grep (AFAIK)와 수 없습니다 당신이 실행하지 않는 한 grep 여러 번 (@ chepner의 답변과 같습니다.)

대안 솔루션 awk 사용하는 것입니다 : 당신은 두 문자열이 일치 할 때문에

awk '/'$string1'/{s1=1}/'$string2'/{s2=1} END { \ 
    if (s1 && s2) print "IT WORKS!!!" ; else print "UH OH!!!" }' "$file" 
+0

실행하면 어떤 이유로 : -bash : ./checkXML.sh :/usr/bin/bash^M : 불량 인터프리터 : 해당 파일이나 디렉토리가 없습니다. – abundantmussel

+0

쉘 위치 잘못되었으므로'/ bin/bash '여야합니다. 당신의 코드에서는 작은 실수 ('#!/usr/bin/bash' 대신에'#/usr/bin/bash')로 인해 작동합니다. 그러나, 아마도'bash'는'/ bin/bash'에 있습니다). 두 문자열을 동시에 일치시켜야하는 경우에도이 솔루션은 작동하지 않습니다. 사실, 나는 grep로는 가능하지 않다고 생각한다 (두 줄이 같은 줄에 있지 않다면). – betabandido

+0

나는 그것을 전에 보았고, 그것을 바꿨다. 그러나 행운이 없었다. 두 개의 문자열을 찾으려면 어떤 제안이 있어도 grep은 필수 항목이 아닙니다. 사용하기에 가장 먼저 떠오른 것은 그 첫 번째 것입니다. – abundantmussel

0

를, 비효율적 인 방법은 각 패턴에 대해 한 번 grep를 호출하는 것입니다 :

if grep -q "$string1" && grep -q "$string2" 
then 
echo IT WORKS 
else 
echo UH OH 
fi 

난 상당히 복잡한 정규 표현식을 사용하지 않고 단일 grep 호출로이를 수행하는 방법을 알지 못합니다.

grep -qE "$string1.*$string2|$string2.*$string1" 

같은 뭔가 일할 수있는,하지만 난 그 어떤 잘못된 반응 및/또는 string1string2의 값에 따라 위음성을 포함 할 것입니다 확신합니다. 두 문자열 일치가 충분하다고 가정하면

+1

두 정규 표현식이 같은 줄에있을 때만 복잡한 정규 표현식이 작동합니다. – tripleee

+0

문자열은 기본적으로 별도의 줄에 파일의 시작과 끝이 될 것입니다. – abundantmussel

1

당신은 두 번 파일을 읽을 필요가 grep 것이다 사용 :

if grep "$string1" "$file" && grep "$string2" "$file" 

을하지만, 당신이 플래그를 설정할 수 있습니다 AWK를 사용하여 한 번만 파일을 읽을해야합니다 :

awk -v s1="$string1" -v s2="$string2" '$0 ~ s1 {f1 = 1} $0 ~ s2 {f2 = 1} END {if (f1 && f2) {print "Yes"} else {print "No"}}' "$file" 
+0

고맙습니다. $ string" "$ string2"'$ string1 ""$ string2 " 이 파일을 다음 파일에 쓰는 것을 시도해 볼 것입니다. 화면의 출력을 파일로 변경하고 거기에서 나가야한다고 가정합니다. – abundantmussel

+0

괜찮아 보이지만 테스트 중에는 문자열 중 하나가 없어도 Yes가 표시됩니다. – Sorpigal

+0

이 코드는 TEST1 또는 TEST2를 찾으면 행복해 보입니다. 나는이 두 가지를 모두 맞추기 위해 어떻게 변화시켜야하는지 알게 될 것이다. – abundantmussel

관련 문제