![이제 컷에 줄 길이 제한이 있나요?](https://linux55.com/image/164138/%EC%9D%B4%EC%A0%9C%20%EC%BB%B7%EC%97%90%20%EC%A4%84%20%EA%B8%B8%EC%9D%B4%20%EC%A0%9C%ED%95%9C%EC%9D%B4%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
25,000자를 사용하는 스크립트가 있고 그 안에 "cut"을 사용합니다.
...\n" | cut -c -$LENGTH
자주 사용하지는 않지만 효과가 있었습니다(아, 약 1~2년 전). 물론, 내 시스템 관리자가 일부 업데이트를 실행했을 수도 있지만 기본 유틸리티 변경은 더 이상 발생하지 않을 것 같습니다. 내가 틀린 것 같습니다.
이제 오류가 발생합니다.
cut: [-bcf] list: 3080 too large (allowed 1-2048)
...내 터미널에는 전체 텍스트/문자 페이지도 없습니다.
더 큰 텍스트 덩어리에서 임의의 덩어리를 가져올 수 있는 POSIX 유틸리티가 있습니까? 아니면 awk/sed/perl을 사용해야 합니까? 그리고 정기적으로 사용하지 않을 때마다 교체하는 것에 대해 걱정하시나요?
오픈BSD 6.4
절단 가능한 버전이 없습니다. 그 남자는 이렇게 말했습니다.
cut 유틸리티는 IEEE Std 1003.1-2008("POSIX.1") 사양을 준수합니다.
OpenBSD 6.4 2016년 10월 24일 OpenBSD 6.4
답변1
IEEE Std 1003.1-2008("POSIX.1") 사양을 준수합니다.
이 사양의cut
(그리고 그 이상)이 말했다:
입력 파일은 텍스트 파일이어야 하지만 줄 길이는 제한되지 않습니다.
다음 정의텍스트 파일:
0개 이상의 줄로 구성된 문자가 포함된 파일입니다. 이 줄에는 NUL 문자가 포함되어 있지 않으며
{LINE_MAX}
<newline> 문자를 포함하여 어떤 줄도 바이트보다 길 수 없습니다. […]
~에 대한{LINE_MAX}
:
{LINE_MAX}
별도로 명시하지 않는 한, 유틸리티가 텍스트 파일을 처리하는 것으로 설명될 때 유틸리티 입력 줄(표준 입력 또는 기타 파일)의 최대 길이(바이트)입니다. 길이에는 후행 <newline> 공백이 포함됩니다.
최소 허용 값:{_POSIX2_LINE_MAX}
{_POSIX2_LINE_MAX}
별도로 명시하지 않는 한, 유틸리티가 텍스트 파일을 처리하는 것으로 설명될 때 유틸리티 입력 줄(표준 입력 또는 기타 파일)의 최대 길이(바이트)입니다. 길이에는 후행 <newline> 공백이 포함됩니다.
값: 2048
임의 길이의 행을 거부하면 안 되는 것처럼 보이지만 그렇다고 OR에 cut
제한이 없다는 의미는 아닙니다. 관찰한 제약 조건은 (가정) 또는 (고정)으로 인해 발생할 가능성이 높습니다(참조-c
-b
allowed 1-2048
{LINE_MAX}
{_POSIX2_LINE_MAX}
이 댓글).
일반적으로 말하면 {_POSIX2_LINE_MAX}
안전한 값이어야 합니다. {LINE_MAX}
아마도 더 클 수도 있지만 적어도 {_POSIX2_LINE_MAX}
2048년입니다.
다음 중 하나를 비교해보세요.예:
POSIX.1-2008 이 볼륨에 있는 대부분의 유틸리티는 텍스트 파일에서 작동합니다. Cut 유틸리티를 사용하면 임의의 행 길이의 파일을 동일한 데이터가 포함된 텍스트 파일 세트로 변환할 수 있습니다. 붙여넣기 유틸리티를 사용하면 임의의 줄 길이로 파일을 만들거나 다시 만들 수 있습니다. 예를 들어, 파일에 긴 줄이 포함되어 있는 경우:
cut -b 1-500 -n file > file1 cut -b 501- -n file > file2
file1
500바이트(+ <newline> 포함) 이하의 줄로 (텍스트 파일)을 생성 하고file2
파일의 나머지 데이터를 포함합니다. (file2
파일의 줄이 바이트보다 길면 텍스트 파일이 아닙니다.)500 + {LINE_MAX}
원본 파일은 다음을 사용하여 다시 만들 수 있습니다.file1
file2
paste -d "\0" file1 file2 > file
이는 "더 큰 텍스트 블록에서 임의의 블록을 가져오는" POSIX 방식을 제공합니다. 원하는 총계를 얻는 데 필요한 만큼 각 줄의 시작 부분에서 2048 이하의 바이트를 잘라냅니다. 예를 들어 행당 3080바이트가 필요한 경우 먼저 2000바이트를 꺼낸 다음 나머지 1080바이트를 꺼낼 수 있습니다.
cut -b 1-2000 file > file1 # first 2000 bytes
cut -b 2001- file > file2 # remainder
cut -b 1-1080 file2 > file3 # following 1080 bytes
paste -d "\0" file1 file3 > file_final # desired 3080 bytes (or less) per line
정확히 2048바이트 인 경우 cut
개행 문자가 추가된 결과 줄은 2048바이트를 초과할 수 있으며 (문서를 올바르게 해석한 경우) 텍스트 파일로 간주되지 않을 수 있습니다. 따라서 만일을 대비해 최대 2047을 사용하겠습니다.
답변2
OpenBSD의 유틸리티는 cut
항상 -c
주어진 옵션의 범위를 최종 값 _POSIX2_LINE_MAX
(OpenBSD의 경우 2048, 참고자료 참조 getconf _POSIX2_LINE_MAX
)으로 제한합니다.
2018년 초, 버그로 인해 명령줄 옵션 구문 분석에서 분할 오류가 발생했습니다.수정되었습니다. 이 유틸리티의 패치는 다음과 같은 영향을 미칩니다.보고 있는 오류를 출력하는 코드 영역, 그러나 이것이 특정 사용 사례에 대한 유틸리티의 동작을 변경하는지 확실하지 않습니다. -c -3080
이 패치를 적용하기 전에도 유틸리티에서 불만이 표시됩니다.
cut
다음 을 사용하여 파일을 임의의 줄 길이로 자르려면카밀의 대답.
또 다른 가능성은 Perl로 전환하는 것입니다(OpenBSD 기본 시스템에서 사용 가능).
perl -pe '$_=substr($_,0,3080)' file
또는 $LENGTH
길이에 관계없이 다음을 수행합니다.
perl -pe 'BEGIN { $len = $ARGV[0]; shift @ARGV } $_=substr($_,0,$len)' "$LENGTH" file
이는 Perl에 추가될 cut -b
옵션 을 에뮬레이트합니다.cut -c
-Mopen=locale
파일 이름이 지정되지 않으면 명령은 표준 입력에서 읽습니다.
쉘 함수로 캡슐화됨:
pcut () {
perl -pe 'BEGIN { $len = $ARGV[0]; shift @ARGV } $_=substr($_,0,$len)' "$@"
}
이는 다음과 같이 사용됩니다.
some-command | pcut "$LENGTH"
sed
및 awk
(POSIX 유틸리티)에는 입력 파일이 다음과 같아야 한다는 제한이 있습니다 .텍스트 파일. 엄격한 POSIX 의미에서 "텍스트 파일"은 길이가 바이트 미만인 개행으로 구분된 문자열의 파일입니다 _POSIX2_LINE_MAX
. Perl은 POSIX 유틸리티가 아니며 이러한 제한이 적용되지 않습니다.