스크립트를 사용하여 텍스트 파일의 유효성을 검사하고 싶습니다.
확인할 파일은 다음과 같습니다.
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}