Text-Processing

sed:如何在正則表達式中插入換行符?

  • October 8, 2020

我正在嘗試格式化文本文件。現在它通常看起來像這樣:

s ApartCD Compact DiscCD-ROM Compact Disc-Read-Only MemoryCD-RW Compact Disc-RewritableCDFS Compact Disc File SystemCERT Computer Emergency Response TeamCFS 中央文件系統、通用文件系統或命令文件系統ACRONYM SPELLED OUTCGA Computer Graphics and ApplicationsCIDR Classless Inter-Domain RoutingCIFS通用網際網路文件系統CMOS互補金屬氧化物半導體CNR通信和網路RiserCOMx通信埠(x=埠號)CPU中央處理器CRT陰極射線管DaaS數據即服務DAC自由訪問控制DB-25串列通信D-Shell連接器,25針DB-9串列通信 D 殼連接器,9 針DBaaS 數據庫即服務 DC 直流直流 DDoS 分佈式拒絕服務DDR 雙倍數據速率DDR RAM 雙倍數據速率隨機存取儲存器DFS 分佈式文件系統DHCP 動態主機配置協議DIMM 雙列直插式記憶體模組DIN Deutsche Industrie NormDLT 數字線性磁帶DLP 數字光P

這只是我複制的一個樣本。首先,我想在每個小寫字母實例之間插入一個換行符,然後緊跟一個大寫字母。我通過閱讀 GNU sed 手冊發現我可以使用括號範圍[:lower:],並且[:upper:]為此,(我認為[[:lower:]]+[[:upper:]]是正確的模式)但我還沒有確定正確的命令或通用語法來完成這項工作。我找到了幾個用於附加換行符的命令,但沒有找到用於將它們插入正則表達式的命令。

這是我第一次使用 sed。我不知道這是否是這項工作的最佳工具。非常感謝任何幫助,如果不是太麻煩,請解釋你的命令,這樣我也許可以學到一些東西,而以後不必打擾任何人。謝謝你。

使用 GNU sed 試試這個:

$ sed 's/\([a-z]\+\)\([A-Z]\)/\1\n\2/g' text.txt 

對於您的輸入,它會產生:

s Apart
CD Compact Disc
CD-ROM Compact Disc-Read-Only Memory
CD-RW Compact Disc-Rewritable
CDFS Compact Disc File System
CERT Computer Emergency Response Team
CFS Central File System, Common File System, or Command File System
ACRONYM SPELLED OUTCGA Computer Graphics and Applications
CIDR Classless Inter-Domain Routing
CIFS Common Internet File System
CMOS Complementary Metal-Oxide Semiconductor
CNR Communications and Networking Riser
COMx Communication port (x=port number)CPU Central Processing Unit
CRT Cathode-Ray Tube
Daa
S Data as a Service
DAC Discretionary Access Control
DB-25 Serial Communications D-Shell Connector, 25 pins
DB-9 Serial Communications D-Shell Connector, 9 pins
DBaa
S Database as a Service DC Direct Current
DDo
S Distributed Denial of Service
DDR Double Data Rate
DDR RAM Double Data Rate Random Access Memory
DFS Distributed File System
DHCP Dynamic Host Configuration Protocol
DIMM Dual Inline Memory Module
DIN Deutsche Industrie Norm
DLT Digital Linear Tape
DLP Digital Light P

一些解釋:

我假設您知道什麼是“擷取組”,因為您了解該模式。

字元串's/\([a-z]\+\)\([A-Z]\)/\1\n\2/g'按字元分為 4 部分/

第一部分s替代的意思。

第二部分是圖案。該模式包含兩個擷取組:[a-z]\+[A-Z]. 以您輸入的單詞“DDoS”為例。第一個擷取組將擷取“o”,第二個擷取組將擷取“S”。整個模式匹配“oS”。

第三部分\1\n\2將替換模式匹配的字元串。\1指第一個擷取組[a-z]\+,在“DDoS”範例中,它是“o”。\2指第二個擷取組[A-Z],在“DDoS”範例中,它是“S”。\n表示換行符。所以結合在一起你會得到“o\nS”,它將替換匹配的字元串“oS”。

第四部分g錶示global。如果省略,sed將找到第一個匹配項,進行替換並退出。使用g,sed將搜尋所有匹配的字元串並進行替換。

詳細說明可以參考sed 手冊

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