AWK:行を72文字に改行

AWK:行を72文字に改行
$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg

つまり、72文字以降に追加して続行したいので、最初はすべてのシングルを削除して追加する必要が\nあるかもしれません。\n他のツールを使用する方が簡単かもしれませんが、awkを試してみましょう。

【書き直す】

Williamsonは正しい答えを提供しますが、それを読むのに助けが必要です。以下の簡単な例を使用して、質問をいくつかの部分に分けました。

  1. 以下のコードが\t両方の場合、印刷されるのはなぜですか?gsub何を置き換えるのですか? xは最後に奇数0のダミーファイルです。

  2. 攻撃ラインline = $0 \n more = getline \n gsub("\t"," ")内部ウィリアムソンの答えline明らかにstdout全体を取得し、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

答え1

awkを使わずに

私はこれがおそらくawkで解決しようとするより大きな問題の一部であることを知っているか、awkawkをよりよく理解しようとしていますが、実際に行の長さを72列に維持したい場合は、次の方法があります。たくさんより良いツール。

このfmtツールは、次の点を念頭に置いて特別に設計されています。

fmt --width=72 filename

fmtまた、出力を読みやすくするために、適切な行を改行しようとします。 「合理的な場所」とは何かについては、infoこのページを参照してください。fmt

答え2

以下は、長い行をラップし、残りの行と短い行を再ラップする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
}
'

CPANには、テキスト形式を効果的に変更するPerlスクリプトがあります。知られているパラジ個人文書)。ハイフンを入れるには以下も必要です。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

左マージンオプションをサポートするために変更したいくつかの違いは次のとおりです。

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";

答え3

Awkは特に厄介な言語ではなく、Turing-complete言語なので、行をカットするのは簡単です。これは単純なコマンド型バージョンです。

awk -v WIDTH=72 '
{
    while (length>WIDTH) {
        print substr($0,1,WIDTH);
        $0=substr($0,WIDTH+1);
    }
    print;
}
'

単語間の行を切り捨てるにはawkでコーディングすることができますが、単語を識別することはマイナーな問題ではありません(アルゴリズムの難しさよりも自然言語に関連しているため)。多くのシステムにはというユーティリティがありますfmt

答え4

awkコードがタブをエクスポートする理由とゼロがどこから来るのか尋ねました。

  1. helloこのコードは呼び出しを介して文字列を変更しませんgsub()gsub()に作用する2つのパラメータがあります$0。実際にhallo変数を変更するにはを使用しますgsub(..., ..., hallo)

  2. gsub()置換回数が返されるため、文字列の末尾にゼロが表示され、ある時点でこの数値が値に追加されますhallo

私は、テキスト段落をラップして書式設定するために特別に設計されたユーティリティを3つ以上知っています。

  1. fold、「折りたたみ線フィルタ」、すなわち標準POSIXユーティリティ。改行のみを挿入し、テキストをリフローしません。

  2. fmt、「単純なテキストフォーマッタ」で、Unixシステムにもデフォルトでインストールされることが多く、fold段落を並べ替えるよりもスマートです。

  3. par段落書式を再指定するためのフィルタ「」には、段落プレフィックスとサフィックス(ASCIIボックスで囲まれたテキストまたは一部のソースコードのコメント)を検出するための追加機能があり、インデントとインデントの割合を処理しますfmt

関連情報