파일에 연속적으로 21개 이상의 빈 줄이 포함되어 있으면 오류 메시지를 보내야 합니다. 공백에는 공백이 포함될 수 있습니다. 새 서버로 전환했을 때 현재 솔루션이 작동을 멈췄습니다. 한 번도 작동하지 않았을 수도 있지만 저는 다양한 스크립트가 작동하는지 확인하는 임무를 맡고 있습니다. 스크립트는 Bash로 작성되었으므로 이상적으로는 솔루션이 Bash와 함께 작동할 것입니다. 그렇지 않으면 문제가 될 것이라고 생각되는 스크립트 내에서 전환해야 합니다.
오류 메시지에는 빈 줄 앞과 뒤에 줄도 포함되어야 합니다.
이것은 이전에 사용된 것입니다: grep을 사용하여 질문 수를 계산합니다(0보다 크면 이메일을 보냅니다).
grep -nc $'[\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a]' filename
문제 줄 표시(이메일에 표시됨)
grep -n $'[\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a]' filename
다시 말하지만 이것이 효과가 있는지 모르겠습니다. 하지만 제대로 작동하도록 해야 합니다. 나는 이것을 사용해 보았고 계산에 작동합니다 ... 그러나 공백이 있고 작동하기 전/후 행을 얻을 수 없으면 작동하지 않습니다.
grep -czoP '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n' filename
답변1
스크립트를 사용하여 awk
파일에 특정 수 이상의 빈 줄이 있는지 또는 공백(공백 및/또는 탭)만 포함되어 있는지 감지합니다.
if ! awk -v max=21 '/^[[:blank:]]*$/ { if (++count >= max) exit 1; next } { count = 0 }'
then
echo 'file contains 21 or more consecutive blank lines'
else
echo 'file contains no more than consecutive 20 blank lines'
fi <file
그러면 입력 파일의 각 줄에 대해 정규식을 ^[[:blank:]]*$
차례로 일치시킵니다. 이 표현식은 빈 줄과 공백 및/또는 탭만 포함된 줄과 일치합니다. 표현식이 일치하면 카운터가 증가합니다. 카운터가 지정된 최대값( max
명령줄에 설정된 변수)에 도달하면 스크립트는 0이 아닌 종료 상태로 종료됩니다. 표현식이 일치하지 않으면 카운터가 0으로 재설정됩니다.
답변2
정규식을 사용하여 더 복잡한 일치 항목을 검색할 수 있습니다. 귀하의 경우에는 공백 문자(0개 이상)를 허용하는 각 줄에 추가해야 합니다(21개가 아닌 3개 줄로 잘랐습니다).
grep -czP '[ ]*\n[ ]*\n[ ]*\n' filename
답변3
awk
귀하의 질문으로 돌아가서, 그것이 작업에 더 적합하다는 데 동의합니다 . 다음은 awk
빈 줄 앞과 뒤의 줄을 인쇄하는 스크립트입니다.
awk 'BEGIN{AA="";BB="";CC=0}{LST=CC;if(CC==0){BB=AA};AA=$0;if($0 ~ "^[[:space:]]*$"){CC++}else{CC=0;if(LST>21){print "Error:\n"BB"\n"LST" free, to:\n"AA"\n\n"}}}' searched.txt
디버깅에 도움이 되는 awk 명령을 파일에 저장할 수 있습니다. 이러한 파일은 다음과 같습니다.
BEGIN{AA="";BB="";CC=0}
{ LST=CC;if(CC==0){BB=AA};AA=$0;
if( $0 ~ "^[[:space:]]*$") { CC++ }
else { CC=0;
if(LST>21) {print "Error:\n"BB"\n"LST" free, to:\n"AA"\n"}};
}
bash 명령은 다음과 같아야 합니다.
awk -f command.file searched.txt
공백 앞뒤에 한 줄 이상이 있다고 가정한 예입니다. searched.txt
빈 줄(공백 포함) 외에 다른 줄이 없는 경우 이 예를 적용 할 수 있습니다 . searched.txt
21개 이상의 빈 줄로 시작하거나 끝납니다 .
답변4
while read -r line; do
# add +1 every time the line is empty, reset the count if line contains anything
[[ -z $line ]] && i=$((i+1)) || i=0
if [[ $i -ge 20 ]]; then
# Do the error handeling in this block
echo "ERROR: 20+ empty consecutive lines"
break # stop reading file by breaking the loop
fi
done <file
이 답변은 누락된 조건을 포함하도록 편집되었습니다.