…사실이에요아니요모든 라인에 존재
줄의 최대 길이를 표시하는 예 |
(예: 79자(줄 끝 제외) 및 SPECIAL_WORD
제목에 언급된 마지막 단어):
Some words with(some = ! characters, beside ASCII) sdsdds |
Some words with(some = ! characters, beside ASCII) SPECIAL_WORD |
|
Some words (some = ! characters, beside ASCII) as SPECIAL_WORD |
Some words (some = ! characters, beside ASCII) asdb asd |
foobar blah SPECIAL_WORD |
eside ASCII) asdb asd eside ASCII) asdb asd eside ASCII) asdb asd eside ASCII)| asdb asd SPECIAL_WORD
Some words (some = ! characters, be |
Some words (some = ! characters, beSome words (some = ! characters, be SPECIAL|_WORD
Some words (some = ! characters, beside ASCII) as SPECIAL_WORD |
|
|
Some words (some = ! characters, beside ASCII) as SPECIAL_WORD|
Some words (some = ! characters, beside ASCII) as SPECIAL_W|ORD
Some words (some = ! characters, beside ASCII) asdb asd |
|
Some words (some SPECIAL_WORD = ! characters, beside ASCII) asdb asd |
|
예상 출력:
Some words with(some = ! characters, beside ASCII) sdsdds |
Some words with(some = ! characters, beside ASCII) SPECIAL_WORD|
|
Some words (some = ! characters, beside ASCII) as SPECIAL_WORD|
Some words (some = ! characters, beside ASCII) asdb asd |
foobar blah SPECIAL_WORD|
eside ASCII) asdb asd eside ASCII) asdb asd eside ASCII) asdb asd eside ASCII)| asdb asd SPECIAL_WORD
Some words (some = ! characters, be |
Some words (some = ! characters, beSome words (some = ! characters, be SPECIAL|_WORD
Some words (some = ! characters, beside ASCII) as SPECIAL_WORD|
|
|
Some words (some = ! characters, beside ASCII) as SPECIAL_WORD|
Some words (some = ! characters, beside ASCII) as SPECIAL_WORD|
Some words (some = ! characters, beside ASCII) asdb asd |
|
Some words (some SPECIAL_WORD = ! characters, beside ASCII) asdb asd |
|
꽤 혼란스럽죠? 내가 시행하려는 규칙은 다음과 같습니다.
SPECIAL_WORD
이렇게 오른쪽으로 정렬하세요 .
- 의 마지막 문자는
SPECIAL_WORD
79열에 있어야 하며, 이는 줄 문자 끝 이전의 마지막 문자입니다. SPECIAL_WORD
줄 끝 문자를 제외한 문자가 뒤에 오면 해당 줄을 건드리면 안 됩니다 .- 포함된 줄이
SPECIAL_WORD
이미 허용된 길이를 초과한 경우 줄 왼쪽에 충분한 공간이 없으면 해당 줄을 건드리지 않아야 합니다.SPECIAL_WORD
SPECIAL_WORD
줄의 마지막 문자와 줄의 첫 번째 문자 사이에 공백이 없으면SPECIAL_WORD
해당 줄을 만지지 마십시오. 5 - 오른쪽 정렬 후 줄의 길이가SPECIAL_WORD
제한보다 클 경우 해당 줄을 만지지 마십시오.SPECIAL_WORD
여러 단어를 포함할 수 있지만 하나의 단위로 처리되어야 합니다.SPECIAL_WORD
ASCII 문자로만 구성됩니다.- 항상 한 줄이며 줄 바꿈이 발생하지 않습니다.
SPECIAL_WORD
col
나는 , , Bash 와 column
같은 일반적인 접근 방식을 시도했지만 여기에 나열된 대부분의 아이디어( , 짧은 쉘 스크립트 스니펫 등)를 시도했지만 모든 것이 일종의 "닫혀 있지만 시가는 없습니다"입니다. 규칙을 덜 엄격하게 만들어 삭제해야 했던 기능/스크립트 중 하나가 이제 작동할 수도 있지만 너무 많아서 모두 기억할 수 없습니다.fmt
format
printf
awk
sed
이 작업을 수행하기 위한 완전한 파서를 작성하기 전에 여기에서 내 문제에 대한 더 간단한 해결책이 있는지 물어보겠습니다.
올바른 주장을 통해 여기에 시도한 것과 가장 가까운 것을 게시할 수 있습니다.
cat format_test | perl -e 'my $len;foreach my $line ( <STDIN> ) {$line =~ /^$/ and print $line and next;$line =~ /^(.+?)( *?)(SPECIAL_WORD)?$/;$len = 79-(length($1)); printf("%s%${len}s\n", $1,$3);}'
( cat
입력이 파이프에서 오는 것을 명확하게 하기 위해 사용됨)
모든 Perl 프로그래머에게 깊은 사과를 드립니다!
그 작은 혐오의 결과는 다음과 같습니다.
Some words with(some = ! characters, beside ASCII) sdsdds
Some words with(some = ! characters, beside ASCII) SPECIAL_WORD
Some words (some = ! characters, beside ASCII) as SPECIAL_WORD
Some words (some = ! characters, beside ASCII) asdb asd
foobar blah SPECIAL_WORD
eside ASCII) asdb asd eside ASCII) asdb asd eside ASCII) asdb asd eside ASCII) asdb asdSPECIAL_WORD
Some words (some = ! characters, be
Some words (some = ! characters, beSome words (some = ! characters, beSPECIAL_WORD
Some words (some = ! characters, beside ASCII) as SPECIAL_WORD
Some words (some = ! characters, beside ASCII) as SPECIAL_WORD
Some words (some = ! characters, beside ASCII) as SPECIAL_WORD
Some words (some = ! characters, beside ASCII) asdb asd
Some words (some SPECIAL_WORD = ! characters, beside ASCII) asdb asd
이는 작동하지 않아야 하는 라인에서 작동합니다.
답변1
를 사용 perl
하고 모든 문자가 단일 너비 문자라고 가정합니다.
perl -Mopen=locale -lspe '
BEGIN{$pad = $width - 1 - length $word}
s/(.*?)\s+\Q$word\E$/sprintf "%-*s %s", $pad, $1, $word/e
' -- -width=79 -word=SPECIAL_WORD < your-file
답변2
이 글을 작성해 드릴 수는 있지만 무료는 아닙니다 :) 시작하려면 규칙 3이 아래에 구현되어 있습니다.
BEGIN { LEN=length(special_word)
print "special word is", special_word
print "LEN is", LEN }
$NF == special_word && length($0)<maxlength { print "PROCESSING: " $0; next }
{ print }
규칙 5에는 약간의 천재성이 필요하지만 다른 규칙은 제가 보기에는 매우 간단해 보입니다.특별한 단어그리고최대 길이프로그램 호출 시 반드시 설정해야 하는 매개변수입니다. 프로그램이 다음과 같은 경우오른쪽 정렬.awk, 당신은 다음과 같이 실행합니다 awk -f rightalign.awk -v special_word=SPECIAL_WORD -v maxlength=80 inputfile
.