$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg
즉, 72자 이후에 추가하고 계속하기를 원하므로 처음에는 모든 싱글을 제거 하고 추가 \n
해야 할 수도 있습니다 . \n
다른 도구를 사용하는 것이 더 쉬울 수도 있지만 awk를 사용해 보겠습니다.
[고쳐 쓰다]
Williamson은 정답을 제공하지만 이를 읽는 데 도움이 필요합니다. 아래의 간단한 예를 사용하여 질문을 여러 부분으로 나누었습니다.
아래 코드가
\t
두 경우 모두 인쇄되는 이유는 무엇이며gsub
무엇을 바꿔야 합니까? x는 끝에 홀수 0이 있는 더미 파일입니다.공격라인
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로 해결하려는 더 큰 문제의 일부일 것이라는 것을 알고 있거나 awk
awk를 더 잘 이해하려고 노력하고 있지만 실제로 행 길이를 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이 어디서 나오는지 물으셨습니다 .
hello
이 코드는 호출을 통해 문자열을 수정 하지 않습니다gsub()
.gsub()
에 작용하는 두 가지 매개변수가 있습니다$0
. 실제로hallo
변수를 수정하려면 를 사용하십시오gsub(..., ..., hallo)
.gsub()
대체 횟수가 반환되므로 문자열 끝에 0이 표시되고 어느 시점에서는 이 숫자를 값에 추가하게 됩니다hallo
.
나는 텍스트 단락을 래핑하고 서식을 지정하기 위해 특별히 설계된 유틸리티를 세 개 이상 알고 있습니다.
fold
, "접는 선 필터", 즉표준 POSIX 유틸리티. 개행만 삽입하고 텍스트를 리플로우하지 않습니다.fmt
, "간단한 텍스트 포맷터"로 Unix 시스템에도 기본적으로 설치되는 경우가 많으며fold
단락을 다시 정렬하는 것보다 더 똑똑합니다.par
,"단락 서식을 다시 지정하기 위한 필터”에는 단락 접두사와 접미사(예: ASCII 상자로 둘러싸인 텍스트 또는 일부 소스 코드의 주석)를 감지하는 추가 기능이 있으며 들여쓰기 및 들여쓰기 비율을 처리합니다fmt
.