…并非在每一行中都存在
|
标记行的最大长度的示例,例如不包括行尾的 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
, column
, fmt
, format
, Bash 之类的常见嫌疑人,printf
这里列出的大多数想法(awk
,简短的 shell 脚本片段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
这在它不应该的行上工作。
使用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句