HOWTO · Bash
Bash에서 빈 줄을 제거하는 방법
이 튜토리얼에서는 Bash에서 빈 줄을 제거하는 방법을 설명합니다.
이 페이지의 내용
텍스트 파일에 원치 않는 빈 줄이 포함되어 있다면 sed, grep 또는 awk를 사용하여 파일을 표시하면서 빈 줄을 필터링할 수 있습니다. 아래의 각 명령은 남겨 둘 줄을 표준 출력으로 보내며 원본 파일은 변경하지 않습니다. 이 명령들은 Bash 또는 다른 POSIX 호환 셸에서 사용하는 명령줄 유틸리티이며, Bash 키워드나 내장 명령이 아닙니다.
스트림 편집 명령이 필요하면 sed, 간결한 반전 매칭이 필요하면 grep, 필터를 더 큰 레코드 처리 스크립트의 일부로 만들려면 awk를 선택할 수 있습니다. 결과를 저장하려면 명령의 출력을 별도의 파일로 리디렉션한 후 원본을 교체하기 전에 검토하세요. 이러한 유틸리티는 Bash/Linux 및 기타 POSIX 호환 명령줄 환경에서 일반적으로 사용할 수 있습니다.
Bash 입력 파일 준비
명령 예제에서는 1_Test.txt에 네 개의 텍스트 줄이 있고 두 번째 줄과 세 번째 줄 사이에 빈 줄이 하나 있다고 가정합니다. 아래의 완전한 스크립트는 임시 경로에 파일을 만들고 필터를 적용한 다음 결과를 출력합니다. 명령이 끝나면 임시 파일을 삭제합니다. 출력 블록에는 남은 네 줄이 표시됩니다.
temp_dir="$(mktemp -d)"
sample_file="$temp_dir/1_Test.txt"
printf '%s\n' \
'This is the first line.' \
'This is the second line.' \
'' \
'This is the third line.' \
'This is the fourth line.' > "$sample_file"
sed '/^[[:space:]]*$/d' "$sample_file"
rm -f "$sample_file"
rmdir "$temp_dir"
This is the first line.
This is the second line.
This is the third line.
This is the fourth line.
이 명령은 표시되는 결과에서 빈 줄을 제거하면서 비어 있지 않은 네 줄은 그대로 유지합니다.
^[[:space:]]*$ 표현식은 공백 문자만 포함된 줄을 줄의 시작부터 끝까지 일치시킵니다. 따라서 동일한 명령으로 문자가 전혀 없는 줄과 공백 또는 탭만 포함된 줄을 모두 처리할 수 있습니다.
sed 유틸리티로 줄 필터링
sed는 /^[[:space:]]*$/d를 삭제 규칙으로 처리합니다. 패턴이 일치하면 d가 해당 입력 줄을 삭제하므로 표준 출력으로 전달되지 않습니다. 샘플 파일에는 sed '/^[[:space:]]*$/d' 1_Test.txt를 실행하세요.
이 명령은 원본 파일을 변경하지 않습니다. 새로 정리된 파일이 필요하면 sed '/^[[:space:]]*$/d' 1_Test.txt > cleaned.txt처럼 출력을 별도의 경로로 리디렉션하고, 원본을 교체하기 전에 검토하세요. 필터링된 스트림을 저장하는 것은 리디렉션이며, sed 자체는 여전히 원래 경로를 읽습니다.
grep 유틸리티로 줄 필터링
grep -v는 매칭을 반전하므로 ^[[:space:]]*$와 일치하지 않는 줄을 출력합니다. 1_Test.txt에는 grep -v '^[[:space:]]*$' 1_Test.txt를 실행하세요. 정규 표현식은 sed 명령과 같고, -v는 grep이 일치하지 않는 줄을 유지하도록 지정합니다.
sed 버전과 마찬가지로 grep은 남은 줄을 표준 출력으로 보내며 입력 경로를 편집하지 않습니다. 하나의 패턴에 일치하는 줄을 단순히 제외해야 할 때 편리한 선택입니다. 결과를 저장해야 한다면 출력을 다른 파일로 리디렉션하세요.
다음 독립 실행형 예제는 grep 필터를 적용하기 전에 샘플 파일을 만들므로 기존의 보조 파일에 의존하지 않고 응용할 수 있습니다.
temp_dir="$(mktemp -d)"
sample_file="$temp_dir/1_Test.txt"
printf '%s\n' \
'This is the first line.' \
'This is the second line.' \
'' \
'This is the third line.' \
'This is the fourth line.' > "$sample_file"
grep -v '^[[:space:]]*$' "$sample_file"
rm -f "$sample_file"
rmdir "$temp_dir"
awk 유틸리티로 줄 필터링
awk는 조건이 참일 때 레코드를 출력합니다. 부정 패턴인 ! /^[[:space:]]*$/은 공백 문자보다 많은 내용을 포함하는 모든 줄에서 참이 되므로, awk '!/^[[:space:]]*$/' 1_Test.txt는 1_Test.txt의 의미 있는 줄을 유지합니다.
줄 필터를 더 큰 레코드 처리 스크립트의 일부로 만들 때 이 형식이 유용합니다. 다른 명령과 마찬가지로 이 명령은 남은 레코드만 표준 출력으로 보내며 1_Test.txt를 교체하지 않습니다. 저장된 사본이 필요하면 결과를 리디렉션하거나 별도의 파일 편집 작업 흐름을 사용하세요.
다음 독립 실행형 예제는 동일한 형태의 입력을 awk와 함께 사용하며, 이후 명령을 실행할 수 있도록 원본 경로를 그대로 둡니다.
temp_dir="$(mktemp -d)"
sample_file="$temp_dir/1_Test.txt"
printf '%s\n' \
'This is the first line.' \
'This is the second line.' \
'' \
'This is the third line.' \
'This is the fourth line.' > "$sample_file"
awk '!/^[[:space:]]*$/' "$sample_file"
rm -f "$sample_file"
rmdir "$temp_dir"