막혔어요 - 다음과 같은 텍스트 파일을 파이핑합니다:
cat file1.txt | sed '/^[0-9].*[0-9]$/d' > file2.txt
이 정규식은 텍스트 편집기에서 줄을 캡처하고 이를 사용하여 동일한 파일의 모든 빈 줄을 제거할 때 작동하므로 (Linux/Windows) 개행 형식에는 문제가 없다고 생각합니다.
왜 이것이 행을 삭제하지 않는지, 또는 어떻게 할 수 있는지 궁금합니다.
답변1
몇 가지 추가 참고 사항:
sed '/^[0-9].*[0-9]$/d'
단일 숫자를 포함하는 줄은 삭제되지 않습니다(숫자로 시작하고 끝나는 경우에도 마찬가지).
또한 많은 로케일에서는 [0-9]
숫자 이외의 다른 항목도 일치한다는 점에 유의하세요 0123456789
. 이들만 일치시키려면 [0123456789]
또는 이 필요합니다 [[:digit:]]
.
패턴을 기반으로 행을 필터링하는 더 확실한 명령은 입니다 grep
.
cat
연결 명령입니다. 개별 파일을 연결하는 데는 거의 의미가 없습니다.
여기에서 이러한 모든 문제를 해결하고 선행 또는 후행 공백 문자(예: 입력의 MS-DOS 후행 캐리지 리턴)를 무시하려면 다음을 수행할 수 있습니다.
<file.txt.in grep -e '^[[:space:]]*[^[:digit:][:space:]]' \
-e '[^[:digit:][:space:]][[:space:]]*$' \
-e '^[[:space:]]*$' > file.txt.out
(즉, 숫자가 아닌 다른 것으로 시작하거나 끝나거나(선행 공백 뒤 또는 후행 공백 앞) 모두 공백인 줄을 반환합니다.
또는:
<file.txt.in grep -vx '[[:space:]]*[[:digit:]]\(.*[[:digit:]]\)\{0,1\}[[:space:]]*' > file.txt.out
또는 ERE와 동일합니다.
<file.txt.in grep -vxE '[[:space:]]*[[:digit:]](.*[[:digit:]])?[[:space:]]*' > file.txt.out
필터링이군요나가(사용 -v
) 숫자로 시작하는 줄(선택 사항), 숫자로 끝나는 나머지 줄, 시작 부분에 허용되는 공백 및 ned.
그러나 현재 로케일에서 유효한 문자를 형성하지 않는 바이트 시퀀스가 8xx<non-character>yy8
어디에 있는지 와 같은 줄을 제거하지 못할 수 있습니다 . <non-character>
그러나 어쨌든 유효하지 않은 텍스트 줄에서는 이식성을 많이 기대할 수 없습니다.
답변2
만약에
cat file1.txt | sed '/^\s*$/d' > file2.txt
유효하지만
cat file1.txt | sed '/^[0-9].*[0-9]$/d' > file2.txt
아니요(전자처럼 일하고 싶더라도).
입력 파일에 Windows 캐리지 리턴이 포함될 수 있다는 점을 고려하면 다음 명령을 사용하는 것이 더 안전할 수 있습니다.
cat file1.txt | sed '/^[0-9].*[0-9]\(\r\|$\)/d' > file2.txt
이는 Linux 또는 Windows 캐리지 리턴으로 끝나는 줄을 포함하여 모든 경우에 작동합니다.