我在尝试格式化一个文本文件。现在,它通常看起来如下:
S ApartCD光盘-ROM光盘-只读存储器光盘-RW光盘-可重写CPU光盘文件SystemCERT计算机应急响应TeamCFS中央文件系统通用文件系统或命令文件SystemACRONYM拼写OUTCGA计算机图形和ApplicationsCIDR无类域间RoutingCIFS公共互联网文件互补金属氧化物SemiconductorCNR通信端口(x=port编号)CPU中央处理UnitCRT阴极-Ray TubeDaaS数据作为ServiceDAC自主访问控制D- 25串行通信D-Shell连接器,25 pinsDB-9串行通信D-Shell连接器9 pinsDBaaS数据库作为一种服务直流直接CurrentDDoS分布式拒绝ServiceDDR双数据RateDDR RAM双数据速率随机访问MemoryDFS分布式文件SystemDHCP动态主机配置ProtocolDIMM双内联存储器ModuleDIN Deutsche数字线性TapeDLP数字光P
这只是我复印的一个样本。首先,我想在小写字母的每个实例之间插入一个换行符,紧跟大写字母。通过阅读GNU手册,我发现我可以为此使用方括号范围[:lower:]和[:upper:] (我认为[[:lower:]]+[[:upper:]]是正确的模式),但我还没有确定正确的命令或通用语法来完成这项工作。我已经找到了几个附加换行符的命令,但是没有一个命令可以将它们插入正则表达式。
这是我第一次使用sed。我不知道这是不是这份工作最好的工具。任何帮助都是非常感谢的,如果没有太大的麻烦,请解释你的命令,这样我也许可以学到一些东西,以后也不必打扰任何人。谢谢。
发布于 2020-10-08 10:30:03
使用GNU尝试如下:
$ 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的意思是全局。如果省略,sed将找到第一个匹配项,执行替换并退出。使用g,sed将搜索所有匹配的字符串并执行替换。
有关详细说明,您可以参考sed手册。
发布于 2020-10-08 11:18:53
GNU sed可以使用它的s///命令插入换行符:
sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1\n\2/g' file非GNU sed (如在macOS、BSD和其他非Linux系统上发现的那样)不知道\n在s///命令的替换文本中意味着什么,因此只会插入一个n字符。
要在换行符中替换,必须转义文字换行符,如
sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1\
\2/g' file或者使用变通方法,例如插入数据中不存在的其他占位字符,然后使用y///替换这些字符( y///命令理解\n):
sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1@\2/g' -e 'y/@/\n/' file或
sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1@\2/g' file | tr '@' '\n'请注意,[[:lower:]]匹配单个字符,而[[:lower:]]+ (或作为基本正则表达式编写的[[:lower:]]\{1,\} )至少匹配一个字符。在这种情况下,我们不需要+ (或\{1,\}),因为它足以匹配单个小写字符。
https://unix.stackexchange.com/questions/613500
复制相似问题