wc -L은 탭 문자에 대해 줄 길이 8을보고합니다. 버그 또는 기능?


12

-L의 유용한 기능 wc이므로 생각했습니다. 가장 긴 줄의 길이를 인쇄합니다. 어떤 이유로 단일 바이트 탭 문자를 8 길이로
확장합니다. 탭을 "확장"하지 않도록 설정하는 방법이 있습니까? 그리고이 확장의 배후에있는 이론적 근거는 무엇입니까?

echo -n $'\t' | wc -L

출력 8

wc (GNU coreutils) 7.4
GNU bash, 버전 4.1.5


-n은 질문과 직교합니다.
사용자가 알 수 없음

답변:


11

소스 파일에서 이와 관련된 버그 보고서가 없으며 다음 줄을 찾습니다. wc.c

    case '\t':
        linepos += 8 - (linepos % 8);

의도적으로 이런 식으로 동작하도록 선택하는 것 같습니다. 아마도 파일을 화면에 표시하는 데 필요한 너비에 대한 힌트를 줄 것입니다.

빠른 대안은

echo -n $'\t' | tr '\t' ' ' | wc -L

2
감사합니다 enzo, 나는 지금 man wc이 문제에 대해 언급 하지는 않지만 info coreutils 'wc invocation'( 'man'도 참조)에 언급되어 있습니다 ... 또한 Google sphere를 조금 더 트롤링 한 후에 이것을 대안으로 찾았습니다. echo -n $'\t' | expand -t1 | wc -L, 이것은 당신의 대안과 거의 동일하지만 좋은 척도를 위해 그것을 던져 넣었습니다. 그리고 다음 링크는 wc hack * 재 컴파일 이지만, 일부는 관심이있을 것입니다 : 다른 탭 너비에 대한 wc 지원
베드로

1

일반적으로 탭은 다음 위치 (8로 나눌 수 있음) +1로 확장 [1, 9, 17, 25, ...]되므로 요청하면 얻을 수 있습니다.

-n은 질문과 관련이 없지만 $는 아닙니다.

echo foo$'\t' | wc -L

8도 반환합니다.

echo foo$'\t'bar 
foo     bar

echo에 -e를 사용하면 $를 생략 할 수 있습니다.

echo -e '\t' | wc -L
8

따라서 '\ t'를 단일 바이트로 계산하려면 -e와 $를 생략하십시오.

echo '\t' | wc -L
2

예, 탭을 확장하면 해당 프로그램 인쇄 / 표시 출력을위한 일반적인 충분하지만, 나는 이상한 그것을 발견 카운트 바이트 단어가 계산됩니다 (1 개) 이외의 같은 문자 문자를 ... BTW echo '\t'하지 않습니다 출력 탭 문자 (\ x09). 길이가 2 인 라인을 출력합니다. a '\''t'. 줄 바꿈은 줄 길이의 일부가 아닙니다 ... ( -n내 예제 wc에는 후행 줄 바꿈 문자가없는 파일을 올바르게 처리 할지 여부를 확인하는 예제가 있습니다 ...)
Peter.O

wc --help말한다 : -L, --max-line-length print the length of the longest line?. 바이트가 아니라 줄 길이에 대해 이야기합니다.
사용자가 알 수 없음

1
예, 그것은 말하는가 "가장 긴 줄의 길이를 인쇄" ...`하지만 말을하지 않습니다 우리는 당신이 탭 (대부분의 다른 길이 기능 같은 일반적인 문자 수를하지 않음) 확장한다고 가정 ".. 아,에 의해 특정 탭 정지 위치에 관계없이 탭을 8 칸으로 확장합니다. " ... 그것이 함정입니다. 제대로 문서화되지 않았습니다.
Peter.O

탭을 어떻게 설정합니까? 배쉬에서? 더욱이 : 탭은 8 칸으로 확장되지 않고 위치로 확장 echo -e foo'\t'bar | wc -L되어 14가 아닌 11의 결과를 봅니다 .
사용자 알 수 없음

위에서 foo\tbar예를 들어, wc가정 의 공칭 간격 탭 - 중지 8 ... 방법 다음 예제 쇼 wc현재 활성화 된 탭 정지 설정을 무시합니다. 8 열 터미널 / 길이의 터미널에 행을 출력하지만 wc11 tabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
로보고

0

wc -L 설명이 모호했습니다. 가장 넓은 디스플레이 너비를 반환합니다. 탭 확장을 제어하기 위해 expand먼저 필터링 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.