行の最後の単語を右揃え

行の最後の単語を右揃え

…本当です。いいえすべての行に存在

行の最大長を示す例|(例: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_WORD列79になければなりません。これは行文字の最後の前の最後の文字です。
  2. SPECIAL_WORD行末以外の文字が続く場合は、その行に触れないでください。
  3. 埋め込み行がSPECIAL_WORDすでに許可されている長さを超えている場合、行の左側に十分なスペースがない場合は、その行に触れないでください。SPECIAL_WORD
  4. SPECIAL_WORD行の最後の文字と行の最初の文字の間にスペースがない場合は、その行に触れないSPECIAL_WORDでください。 5 - 右揃え後の行の長さがSPECIAL_WORD制限より大きい場合は、その行に触れないでください。
  5. SPECIAL_WORD複数の単語を含めることができますが、1つの単位として扱う必要があります。
  6. SPECIAL_WORDASCII 文字のみで構成されます。
  7. 常に1行で、改行は発生しません。SPECIAL_WORD

col私は、、Bashなどのcolumn一般的なアプローチを試しましたが、ここにリストされているほとんどのアイデア(、短いシェルスクリプトスニペットなど)を試しましたが、すべてが一種の「閉じていますが葉巻はありません」です。ルールを厳しくして削除する必要がある機能/スクリプトの1つが機能する可能性がありますが、あまりにも多く、すべてを覚えていません。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

おすすめ記事