bash 스크립트의 if 문 안에 개행 문자가 포함된 grep 출력 표시

bash 스크립트의 if 문 안에 개행 문자가 포함된 grep 출력 표시

스크립트를 사용하여 텍스트 파일의 유효성을 검사하고 싶습니다.

확인할 파일은 다음과 같습니다.

FDFHDK JKL
1545665 152
HDKFHDK UHG
YRYRUBH DFG
867HDKE WER

유효한 행은 정규식과 일치해야 합니다 '[A-Z]{7}+[[:space:]]+[A-Z]{3}'.

모든 행이 유효하면 스크립트는 파일이 정상임을 나타내는 메시지를 표시합니다.

하나 이상의 줄이 정규식과 일치하지 않는 경우 스크립트는 메시지를 표시하고 정규식과 일치하지 않는 줄을 표시해야 합니다.

스크립트는 다음과 같습니다

#!/usr/bin/env bash
result=""
output=$(grep -vE '[A-Z]{7}+[[:space:]]+[A-Z]{3}' "$1" |wc -l)
if [[ $output > 0 ]]
then
  echo "These lines don't match:"
  result="${resultado} $(grep -vE '[A-Z]{7}+[[:space:]]+[A-Z]{3}' "$1") \n"
  echo -e $result
else
  echo "The text file is valid"
fi  

예상 출력은 다음과 같습니다.

These lines don't match
FDFHDK JKL
1545665 152
867HDKE WER

그런데 점점 더 많아지네요

These lines don't match:
FDFHDK JKL 1545665 152 867HDKE WER

따라서 실제 스크립트에서는 개행 문자를 고려하지 않습니다.

답변1

테스트를 수행하거나 해당 데이터를 출력하기 위해 명령의 출력을 저장하기 위해 중간 변수를 사용할 이유가 전혀 없습니다.

#!/bin/sh -

if grep -q -v -x -E -e '[A-Z]{7}[[:space:]]+[A-Z]{3}' -- "$1"
then
    echo 'Does not verify. Bad lines follow...'
    grep -v -x -E -e '[A-Z]{7}[[:space:]]+[A-Z]{3}' -- "$1"
fi

+중복된 내용을 제거하기 위해 정규식이 수정되었습니다 {7}. 이 if명령문은 종료 상태를 직접 테스트합니다 grep. 명령문 grep내의 명령 if과 그 뒤의 명령 -x은 전체 행 일치를 강제하는 데 사용되며, 첫 번째 명령문은 아무것도 출력하지 않고 첫 번째 일치에서 중지하는 grep데 사용됩니다 .-q

코드의 실제 문제는 $result따옴표 없이 사용하는 것입니다. 이로 인해 셸은 값을 공백, 탭 및 줄 바꿈으로 분할한 다음 결과 단어에 대해 파일 이름 글로빙을 수행합니다. 그런 다음 최종 단어 세트를 인수로 제공 echo하고 공백을 구분 기호로 사용하여 인쇄합니다.


두 번 실행하는 것이 걱정된다면 grep한 번만 실행하고 출력을 임시 파일에 저장하세요.

#!/bin/sh -

tmpfile=$(mktemp)

if grep -v -x -E -e '[A-Z]{7}[[:space:]]+[A-Z]{3}' -- "$1" >"$tmpfile"
then
    echo 'Does not verify. Bad lines follow...'
    cat -- "$tmpfile"
fi

rm -f -- "$tmpfile"

답변2

나는 이 대안을 제안합니다:

match="$(grep -vEx '[A-Z]{7}[[:space:]]+[A-Z]{3}' "$1")"
[[ "${#match}" -ne 0 ]] && printf "%b\n" "Bad lines:\n${match[@]}"
Bad lines:
FDFHDK JKL
1545665 152
867HDKE WER


노트@them의 답변:

정규 표현식이 수정되었으며 그 뒤의 중복된 +내용이 삭제되었습니다.{7}

관련 정보