AWK: 줄을 72자로 줄 바꿈

AWK: 줄을 72자로 줄 바꿈
$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg

즉, 72자 이후에 추가하고 계속하기를 원하므로 처음에는 모든 싱글을 제거 하고 추가 \n해야 할 수도 있습니다 . \n다른 도구를 사용하는 것이 더 쉬울 수도 있지만 awk를 사용해 보겠습니다.

[고쳐 쓰다]

Williamson은 정답을 제공하지만 이를 읽는 데 도움이 필요합니다. 아래의 간단한 예를 사용하여 질문을 여러 부분으로 나누었습니다.

  1. 아래 코드가 \t두 경우 모두 인쇄되는 이유는 무엇이며 gsub무엇을 바꿔야 합니까? x는 끝에 홀수 0이 있는 더미 파일입니다.

  2. 공격라인 line = $0 \n more = getline \n gsub("\t"," ")내부윌리엄슨의 답변, line분명히 전체 stdout을 가져오고 more팝업 값도 가져옵니다 $0. 그렇죠?

파트 1의 코드

$ gawk '{ hallo="tjena\t tjena2"; gsub("\t"," "); }; END {print hallo; gsub("\t", ""); hallo=hallo gsub("\t",""); print hallo }' x
tjena  tjena2
tjena  tjena20

답변1

awk를 사용하지 않고

나는 이것이 아마도 awk로 해결하려는 더 큰 문제의 일부일 것이라는 것을 알고 있거나 awkawk를 더 잘 이해하려고 노력하고 있지만 실제로 행 길이를 72개 열로 유지하려는 경우에는 다음과 같은 방법이 있습니다.많은더 나은 도구.

fmt도구는 다음 사항을 염두에 두고 특별히 설계되었습니다.

fmt --width=72 filename

fmt또한 출력을 더 쉽게 읽을 수 있도록 적절한 줄을 줄 바꿈하려고 노력합니다. "합리적인 장소"가 무엇인지에 대한 info자세한 내용은 이 페이지를 참조하십시오.fmt

답변2

다음은 긴 줄을 래핑하고 나머지 줄과 짧은 줄을 다시 래핑하는 AWK 스크립트입니다.

awk -v WIDTH=72 '
{
    gsub("\t"," ")
    $0 = line $0
    while (length <= WIDTH) {
        line = $0
        more = getline
        gsub("\t"," ")
        if (more)
            $0 = line " " $0
        else
            $0 = line
            break
    }
    while (length >= WIDTH) {
        print substr($0,1,WIDTH)
        $0 = substr($0,WIDTH+1)
    }
    line = $0 " "
}

END {
    print
}
'

CPAN에는 텍스트 형식을 효과적으로 변경하는 Perl 스크립트가 있습니다. 그것은 알려져있다팔라지(개인 문서). 하이픈을 넣으려면 다음도 필요합니다.TeX::Hyphen.

SWITCHES
--------
The available switches are:

--width=n (or -w=n or -w n)
    Line width is n chars long

--left (or -l)
    Output is left-justified (default)

--right (or -r)
    Output is right-justified

--centered (or -c)
    Output is centered

--both (or -b)
    Output is both left- and right-justified

--indent=n (or -i=n or -i n)
    Leave n spaces for initial indention (defaults to 0)

--newline (or -n)
    Insert blank lines between paragraphs

--hyphenate (or -h)
    Hyphenate word that doesn't fit on a line

왼쪽 여백 옵션을 지원하기 위해 변경한 몇 가지 차이점은 다음과 같습니다.

12c12
< my ($indent, $newline);
---
> my ($indent, $margin, $newline);
15a16
>   "margin:i" => \$margin,
21a23
> $margin = 0 if (!$margin);
149a152
>     print " " x $margin;
187a191,193
>   print "--margin=n (or -m=n or -m n)  Add a left margin of n ";
>   print "spaces\n";
>   print "                                (defaults to 0)\n";

답변3

Awk는 특별히 지저분한 언어가 아닌 Turing-complete 언어이므로 줄을 자르는 것이 쉽습니다. 이것은 간단한 명령형 버전입니다.

awk -v WIDTH=72 '
{
    while (length>WIDTH) {
        print substr($0,1,WIDTH);
        $0=substr($0,WIDTH+1);
    }
    print;
}
'

단어 사이의 줄을 자르려면 awk로 코딩할 수 있지만 단어를 식별하는 것은 사소한 문제가 아닙니다(알고리즘의 어려움보다 자연어와 더 관련이 있기 때문에). 많은 시스템에는 이라는 유틸리티가 있습니다 fmt.

답변4

awk코드가 탭을 내보내는 이유와 0이 어디서 나오는지 물으셨습니다 .

  1. hello이 코드는 호출을 통해 문자열을 수정 하지 않습니다 gsub(). gsub()에 작용하는 두 가지 매개변수가 있습니다 $0. 실제로 hallo변수를 수정하려면 를 사용하십시오 gsub(..., ..., hallo).

  2. gsub()대체 횟수가 반환되므로 문자열 끝에 0이 표시되고 어느 시점에서는 이 숫자를 값에 추가하게 됩니다 hallo.

나는 텍스트 단락을 래핑하고 서식을 지정하기 위해 특별히 설계된 유틸리티를 세 개 이상 알고 있습니다.

  1. fold, "접는 선 필터", 즉표준 POSIX 유틸리티. 개행만 삽입하고 텍스트를 리플로우하지 않습니다.

  2. fmt, "간단한 텍스트 포맷터"로 Unix 시스템에도 기본적으로 설치되는 경우가 많으며 fold단락을 다시 정렬하는 것보다 더 똑똑합니다.

  3. par,"단락 서식을 다시 지정하기 위한 필터”에는 단락 접두사와 접미사(예: ASCII 상자로 둘러싸인 텍스트 또는 일부 소스 코드의 주석)를 감지하는 추가 기능이 있으며 들여쓰기 및 들여쓰기 비율을 처리합니다 fmt.

관련 정보