숫자로 시작하고 끝나는 줄 제거

숫자로 시작하고 끝나는 줄 제거

막혔어요 - 다음과 같은 텍스트 파일을 파이핑합니다:

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 캐리지 리턴으로 끝나는 줄을 포함하여 모든 경우에 작동합니다.

관련 정보