2017-09-06 7 views
3

나는 다음과 같은 코드가있는 경우 :출력을 정규식과 비교할 때 어떻게 bash에서 줄 바꿈을 유지할 수 있습니까?

if [[ "$(cat myfile)" =~ ^scripts\/.* ]]; then 
    echo YES 
else 
    echo NO 
fi 

그리고 "myfile을"는 포함되어 다음

hot/warm 
scripts/whatever 
cold/cool 

결과를 내 코드가 "NO"입니다 실행,하지만 난 그게 YES로 할 때 .

나는 내용을 다시 주문하여 "myfile을"변경하는 경우

있도록 아래와 같이, 먼저 "어떤 스크립트 /"

scripts/whatever 
hot/warm 
cold/cool 

그럼 난 내 스크립트가 YES 참으로 실행 결과. 이 문제는 정규식 패턴이 첫 번째뿐만 아니라 내용의 모든 행에 있는지 여부를 스크립트가 감지하도록하기 때문에 문제가됩니다.

+0

'grep -q'^ scripts /.*$ 'myfile'을 사용하지 않는 이유는 무엇입니까? – chepner

답변

3

귀하의 조건 : 파일 내용이 scripts/로 시작하는 경우

[[ "$(cat myfile)" =~ ^scripts\/.* ]]; 

은 (당신이 cat myfile 명령을 사용하여 추출 할 것을) 전체 파일 데이터에 대한 정규식 확인되고, 따라서 만 일치합니다.

모든 줄 시작과 일치하지 않습니다. 당신이 단지 (아래 설명 참조) git diff 명령 grep을 사용할 수 있습니다에 대한

:

if git diff | grep -q '^scripts/'; then 
    echo 'YES' 
else 
    echo 'NO' 
fi 
+0

'cat myfile'을 예로 사용했지만 실제로 grep 할 실제 파일 대신'git diff' 명령을 실행할 계획입니다. – onlywei

+0

'git diff'를 사용하고 있다면'git diff | grep -q 'scripts /' – anubhava

+1

고마워, 내가 실수로 git diff 코드 블록을 사용하여 여전히 "myfile"에 남아 있다고 생각한다. – onlywei

2

다음과 같이 당신이 잠시 읽기-할 루프를 사용할 수 있습니다 GREP을 사용하지 않도록합니다.

cat myfile | while read LINE; do 
    if [[ "$LINE" =~ ^scripts\/.* ]]; then 
    echo YES 
    else 
    echo NO 
    fi 
done 

난 당신이 게시 된 파일의 두 가지 버전이 실행하고 (당신이 그들을 게시와 같은 순서대로) 다음과 같은 결과를 얻었다 :

YES 
NO 
NO 

NO 
YES 
NO 

을 이것에 관해서는 파일에서 한 줄에 한 번만 인쇄되므로 한 번만 인쇄하려면 YES 조건에서 break을 사용하는 것이 좋습니다. 당신이 "스크립트"는 문자열 라인의 시작 부분에또는의 시작 부분에 표시되는지 테스트하려면

1

, 다음을 수행하십시오

[[ "$(< myfile)" =~ (^|$'\n')scripts/.* ]] 

노트

  • bash 정규 표현식에서 슬래시를 벗어날 필요가 없습니다.
  • $(< file)은 bash 내장 방식입니다. 해야할 일 $(cat file)

이 경우 grep을 anubhava로 사용하면 더 분명하고 빠릅니다.