$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg
つまり、72文字以降に追加して続行したいので、最初はすべてのシングルを削除して追加する必要が\n
あるかもしれません。\n
他のツールを使用する方が簡単かもしれませんが、awkを試してみましょう。
【書き直す】
Williamsonは正しい答えを提供しますが、それを読むのに助けが必要です。以下の簡単な例を使用して、質問をいくつかの部分に分けました。
以下のコードが
\t
両方の場合、印刷されるのはなぜですか?gsub
何を置き換えるのですか? xは最後に奇数0のダミーファイルです。攻撃ライン
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で解決しようとするより大きな問題の一部であることを知っているか、awk
awkをよりよく理解しようとしていますが、実際に行の長さを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
コードがタブをエクスポートする理由とゼロがどこから来るのか尋ねました。
hello
このコードは呼び出しを介して文字列を変更しませんgsub()
。gsub()
に作用する2つのパラメータがあります$0
。実際にhallo
変数を変更するにはを使用しますgsub(..., ..., hallo)
。gsub()
置換回数が返されるため、文字列の末尾にゼロが表示され、ある時点でこの数値が値に追加されますhallo
。
私は、テキスト段落をラップして書式設定するために特別に設計されたユーティリティを3つ以上知っています。
fold
、「折りたたみ線フィルタ」、すなわち標準POSIXユーティリティ。改行のみを挿入し、テキストをリフローしません。fmt
、「単純なテキストフォーマッタ」で、Unixシステムにもデフォルトでインストールされることが多く、fold
段落を並べ替えるよりもスマートです。par
」段落書式を再指定するためのフィルタ「」には、段落プレフィックスとサフィックス(ASCIIボックスで囲まれたテキストまたは一部のソースコードのコメント)を検出するための追加機能があり、インデントとインデントの割合を処理しますfmt
。