Text-Formatting
在 Linux 中格式化文本
我正在嘗試在需要導入系統的文件中格式化數據。該系統在單行中不包含超過 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/ $//'
。