AWK:将行换行为 72 个字符

8 awk text-formatting

$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg
Run Code Online (Sandbox Code Playgroud)

即我希望它\n在 72 个字符后添加并继续,所以最初您可能需要删除所有单个\ns 并添加它们。使用其他工具可能更容易,但让我们尝试 awk。

[更新]

威廉姆森提供了正确的答案,但阅读它需要一些帮助。我在下面用更简单的例子将问题分解成几个部分。

  1. 为什么下面的代码\t在两种情况下都打印,gsub应该替换吗?x 是一个虚拟文件,最后是一些奇怪的 0。

  2. 攻击线line = $0 \n more = getline \n gsub("\t"," ")威廉姆森的答复line显然是得到整个标准输出,而more得到的取出的值$0,对不对?

第 1 部分的代码

$ gawk '{ hallo="tjena\t tjena2"; gsub("\t"," "); }; END {print hallo; gsub("\t", ""); hallo=hallo gsub("\t",""); print hallo }' x
tjena  tjena2
tjena  tjena20
Run Code Online (Sandbox Code Playgroud)

Ste*_*n D 13

不使用awk

我理解这可能只是你正在试图用解决一个更大问题的一部分awk或者干脆试图更好地理解awk的,但如果你真的只是想你的线路长度保持到72列,有很多更好的工具。

fmt工具的设计特别考虑了这一点:

fmt --width=72 filename
Run Code Online (Sandbox Code Playgroud)

fmt还将努力在合理的地方断行,使输出更易于阅读。info有关什么fmt是“合理的地方”的更多详细信息,请参阅页面。

  • macOS 用户可以使用 `fold -s -w 72` (4认同)

Den*_*son 5

下面是一个 AWK 脚本,它对长行进行换行并重新换行剩余部分以及短行:

awk -v WIDTH=72 '
{
    gsub("\t"," ")
    $0 = line $0
    while (length <= WIDTH) {
        line = $0
        more = getline
        gsub("\t"," ")
        if (more)
            $0 = line " " $0
        else
            $0 = line
            break
    }
    while (length >= WIDTH) {
        print substr($0,1,WIDTH)
        $0 = substr($0,WIDTH+1)
    }
    line = $0 " "
}

END {
    print
}
'
Run Code Online (Sandbox Code Playgroud)

CPAN 上有一个 Perl 脚本,它可以很好地重新格式化文本。它称为paradj单个文件)。为了进行连字符,您还需要TeX::Hyphen.

SWITCHES
--------
The available switches are:

--width=n (or -w=n or -w n)
    Line width is n chars long

--left (or -l)
    Output is left-justified (default)

--right (or -r)
    Output is right-justified

--centered (or -c)
    Output is centered

--both (or -b)
    Output is both left- and right-justified

--indent=n (or -i=n or -i n)
    Leave n spaces for initial indention (defaults to 0)

--newline (or -n)
    Insert blank lines between paragraphs

--hyphenate (or -h)
    Hyphenate word that doesn't fit on a line
Run Code Online (Sandbox Code Playgroud)

以下是我为支持左边距选项所做的一些更改的差异:

12c12
< my ($indent, $newline);
---
> my ($indent, $margin, $newline);
15a16
>   "margin:i" => \$margin,
21a23
> $margin = 0 if (!$margin);
149a152
>     print " " x $margin;
187a191,193
>   print "--margin=n (or -m=n or -m n)  Add a left margin of n ";
>   print "spaces\n";
>   print "                                (defaults to 0)\n";
Run Code Online (Sandbox Code Playgroud)