$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg
Run Code Online (Sandbox Code Playgroud)
即我希望它\n
在 72 个字符后添加并继续,所以最初您可能需要删除所有单个\n
s 并添加它们。使用其他工具可能更容易,但让我们尝试 awk。
[更新]
威廉姆森提供了正确的答案,但阅读它需要一些帮助。我在下面用更简单的例子将问题分解成几个部分。
为什么下面的代码\t
在两种情况下都打印,gsub
应该替换吗?x 是一个虚拟文件,最后是一些奇怪的 0。
攻击线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
是“合理的地方”的更多详细信息,请参阅页面。
下面是一个 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)