Text-Formatting

在 Linux 中格式化文本

  • September 5, 2017

我正在嘗試在需要導入系統的文件中格式化數據。該系統在單行中不包含超過 65 個字元的文本。所以,我試圖將描述列中的文本格式化為多行,如下面的範例所示。如果它是單行 Linux 命令對使用者來說真的很有幫助,你能檢查一下是否可能嗎?

文件中的範例輸入 -


深度描述
(英尺) -
12370.0 LS:Mdst、blsh gry、sft、occ mod 公司、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 公司、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,mod 公司,crpxln,chky,arg,SLTST:blk-dk gry,firm-mod hd,amor,gt,mod calc,SH:blk-dk gry,mod 公司,blky-plty, occ 英國人,wxy
12460.0 SH:blk-dk gry,mod 公司,blky-plty,occ brit,ea,SLTST:blk-dk gry,公司-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 mod 公司、
crpxln, prly, arg, SLTST: blk, 公司-mod hd,
amor, gt, mod calc, CLST: lt gry-m gry, sft,
愛,wxy
12400.0 LS:Mdst、blsh gry、mod 公司、crpxln、chky、
arg,SLTST:blk-dk gry,firm-mod hd,amor,
gt, mod calc, CLST: lt gry-m gry, occ rdsh gry,
mod 公司, amor, wxy, tr CHK
12430.0 LS:Mdst、blsh gry、mod 公司、crpxln、chky、
arg,SLTST:blk-dk gry,firm-mod hd,amor,
gt,mod calc,SH:blk-dk gry,mod 公司,
blky-plty,occ 英國人,wxy
12460.0 SH:blk-dk gry,mod 公司,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 軟體包。(範例 - 標準桿)

使用 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

這會在行的末尾留下空格,這些空格可能會被刪除 b 執行它sed 's/ $//'

該表達式3,$s/(.{55} )/\1\n\t/g將替換任何 55 個字元後跟一個空格的相同 55 個字元(和空格),後跟一個換行符和一​​個製表符的縮進。這對行上模式的所有匹配重複。

帶標準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/ $//'

引用自:https://unix.stackexchange.com/questions/390524