![在 Linux 中设置文本格式](https://linux22.com/image/117402/%E5%9C%A8%20Linux%20%E4%B8%AD%E8%AE%BE%E7%BD%AE%E6%96%87%E6%9C%AC%E6%A0%BC%E5%BC%8F.png)
我正在尝试格式化需要导入系统的文件中的数据。该系统单行文本的长度不超过 65 个字符。因此,我尝试将描述列中的文本格式化为多行,如下面的示例所示。如果是单行Linux命令,那对用户来说真的很有帮助,你能检查一下是否可行吗?
文件中的示例输入 -
深度描述 (英尺)- 12370.0 LS:Mdst、blsh gry、sft、occ modfirm、crpxln、prly、arg、SLTST:blk、firm-mod hd、amor、gt、mod calc、CLST:lt gry-m gry、sft、amor、wxy 12400.0 LS:Mdst、blsh gry、modfirm、crpxln、chky、arg、SLTST:blk-dk gry、firm-mod hd、amor、gt、mod calc、CLST:lt gry-m gry、occ rdsh gry、modfirm , 爱, wxy, tr CHK 12430.0 LS:Mdst、blsh gry、modfirm、crpxln、chky、arg、SLTST:blk-dk gry、firm-mod hd、amor、gt、mod calc、SH:blk-dk gry、modfirm、blky-plty、 OCC 英国人,wxy 12460.0 SH:blk-dk gry、modfirm、blky-plty、occ brit、ea、SLTST:blk-dk gry、firm-mod hd、amor、gt、mod calc、SST:gry-dk gry、wl consol、vf , ang, p srt, cotd, slily calc cmt, 无氟
深度和描述及其下面的行被视为标题。深度列包含所有数字,描述列包含应格式化为多行以便系统接受数据的文本。
Linux 命令所需的输出 -
深度描述 (英尺)- 12370.0 LS:Mdst、blsh gry、sft、occ modfirm、 crpxln、prly、arg、SLTST:blk、firm-mod hd、 amor、gt、mod calc、CLST:lt gry-m gry、sft、 爱,wxy 12400.0 LS:Mdst、blsh gry、modfirm、crpxln、chky、 arg,SLTST:blk-dk gry,firm-mod hd,amor, gt、mod calc、CLST:lt gry-m gry、occ rdsh gry、 mod 坚定、爱情、wxy、tr CHK 12430.0 LS:Mdst、blsh gry、modfirm、crpxln、chky、 arg,SLTST:blk-dk gry,firm-mod hd,amor, gt,mod calc,SH:blk-dk gry,modfirm, blky-plty、occ 英国、wxy 12460.0 SH:blk-dk gry、modfirm、blky-plty、occ Brit、 ea、SLTST:blk-dk gry、firm-mod hd、amor、gt、 mod calc,SST:gry-dk gry,wl consol,vf,ang, p srt、cotd、slily calc cmt、无氟
注意 - 用户将无法在其计算机上安装任何 Linux 软件包。 (示例 - 标准杆)
答案1
与标准awk
:
{ printf("%s\t", $1) }
{
linelen = 8; # assume 8 spaces for the first field
for (i = 2; i <= NF; ++i) {
wordlen = length($i);
if (wordlen + linelen > 65) {
# break output line since adding next word
# would make it too long
printf("\n\t");
linelen = 8; # count tab as 8 spaces
}
if (i < NF) {
printf("%s ", $i);
linelen += wordlen + 1; # +1 for the space
} else {
printf("%s\n", $i);
}
}
}
测试:
$ awk -f script.awk file.in
Depth Description
(ft) -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly, arg,
SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST: lt
gry-m gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST: lt
gry-m gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, SH: blk-dk
gry, mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, SST: gry-dk
gry, wl consol, v f, ang, p srt, cotd, slily calc cmt, no
fluor
唯一的缺点是这会在大多数输出行上留下尾随空格。您可以通过传递输出来剥离这些内容sed 's/ $//'
。
答案2
使用 GNU sed
:
$ sed -r '3,$s/(.{55} )/\1\n\t/g' file.in
Depth Description
(ft) -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly,
arg, SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST:
lt gry-m gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg,
SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST:
lt gry-m gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg,
SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, SH:
blk-dk gry, mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea,
SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, SST:
gry-dk gry, wl consol, v f, ang, p srt, cotd, slily calc
cmt, no fluor
这会在行尾留下空格,可以通过运行它来去除这些空格sed 's/ $//'
。
该表达式3,$s/(.{55} )/\1\n\t/g
将用同样的 55 个字符(和空格)替换任何 55 个字符,后跟一个空格,后跟一个换行符和一个制表符缩进。对于该行上模式的所有匹配,都会重复此操作。
答案3
awk解决方案:
awk 'NR<=2{ print }NR>2{ c=0; r=$1;
for(i=2;i<=NF;i++) {
if ((length(r) + length($i)) > (!c? 65:61)) { c++; printf "%s\n\t",r; r=$i }
else { r=r FS $i } if(i==NF) printf "%s",r }
print ""
}' file
NR<=2{ print }
- 按原样打印前两行r
变量,包含每个已处理/格式化的行
输出:
Depth Description
(ft) -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly, arg,
SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST: lt gry-m
gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST: lt gry-m
gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, SH: blk-dk gry,
mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, SST: gry-dk gry,
wl consol, v f, ang, p srt, cotd, slily calc cmt, no fluor