줄의 마지막 단어를 오른쪽 정렬

줄의 마지막 단어를 오른쪽 정렬

…사실이에요아니요모든 라인에 존재

줄의 최대 길이를 표시하는 예 |(예: 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이렇게 오른쪽으로 정렬하세요 .

  1. 의 마지막 문자는 SPECIAL_WORD79열에 있어야 하며, 이는 줄 문자 끝 이전의 마지막 문자입니다.
  2. SPECIAL_WORD줄 끝 문자를 제외한 문자가 뒤에 오면 해당 줄을 건드리면 안 됩니다 .
  3. 포함된 줄이 SPECIAL_WORD이미 허용된 길이를 초과한 경우 줄 왼쪽에 충분한 공간이 없으면 해당 줄을 건드리지 않아야 합니다.SPECIAL_WORD
  4. SPECIAL_WORD줄의 마지막 문자와 줄의 첫 번째 문자 사이에 공백이 없으면 SPECIAL_WORD해당 줄을 만지지 마십시오. 5 - 오른쪽 정렬 후 줄의 길이가 SPECIAL_WORD제한보다 클 경우 해당 줄을 만지지 마십시오.
  5. SPECIAL_WORD여러 단어를 포함할 수 있지만 하나의 단위로 처리되어야 합니다.
  6. SPECIAL_WORDASCII 문자로만 구성됩니다.
  7. 항상 한 줄이며 줄 바꿈이 발생하지 않습니다.SPECIAL_WORD

col나는 , , Bash 와 column같은 일반적인 접근 방식을 시도했지만 여기에 나열된 대부분의 아이디어( , 짧은 쉘 스크립트 스니펫 등)를 시도했지만 모든 것이 일종의 "닫혀 있지만 시가는 없습니다"입니다. 규칙을 덜 엄격하게 만들어 삭제해야 했던 기능/스크립트 중 하나가 이제 작동할 수도 있지만 너무 많아서 모두 기억할 수 없습니다.fmtformatprintfawksed

이 작업을 수행하기 위한 완전한 파서를 작성하기 전에 여기에서 내 문제에 대한 더 간단한 해결책이 있는지 물어보겠습니다.

올바른 주장을 통해 여기에 시도한 것과 가장 가까운 것을 게시할 수 있습니다.

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.

관련 정보