…本当です。いいえすべての行に存在
行の最大長を示す例|
(例: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
複数の単語を含めることができますが、1つの単位として扱う必要があります。SPECIAL_WORD
ASCII 文字のみで構成されます。- 常に1行で、改行は発生しません。
SPECIAL_WORD
col
私は、、Bashなどのcolumn
一般的なアプローチを試しましたが、ここにリストされているほとんどのアイデア(、短いシェルスクリプトスニペットなど)を試しましたが、すべてが一種の「閉じていますが葉巻はありません」です。ルールを厳しくして削除する必要がある機能/スクリプトの1つが機能する可能性がありますが、あまりにも多く、すべてを覚えていません。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