Regex awk分组和拆分多个分隔符
我试图在多个分隔符上拆分一行,并将输出分组为可以重新排序的单个元素。我在BSD系统上运行pkg_info命令。输出如下所示Regex awk分组和拆分多个分隔符,regex,shell,awk,sed,Regex,Shell,Awk,Sed,我试图在多个分隔符上拆分一行,并将输出分组为可以重新排序的单个元素。我在BSD系统上运行pkg_info命令。输出如下所示 yaesu-0.13nb1 Control interface for Yaesu FT-890 HF transceiver skk-jisyo-cdb-201212 Dictionary collection for SKK dbskkd-cdb-2.00nb1 SKK dictionary server based on cdb libchew
yaesu-0.13nb1 Control interface for Yaesu FT-890 HF transceiver
skk-jisyo-cdb-201212 Dictionary collection for SKK
dbskkd-cdb-2.00nb1 SKK dictionary server based on cdb
libchewing-0.2.7 The intelligent phonetic input method library
skk-jisyo-201212 Dictionary collection for SKK
autoconf-2.69nb2 Generates automatic source code configuration scripts
pkg-config-0.28 System for managing library compile/link flags
python27-2.7.5 Interpreted, interactive, object-oriented programming language
软件包名称始终包含字母和数字。版本是附加到名称的最后一个条目,说明始终至少用一个空格分隔。最复杂的例子是,“skk jisyo cdb”是包名。“201212”为版本,“SKK字典集”为说明
我需要将版本与包名分开,包名保持不变,并在其中保留“-”,同时将版本信息从中分离出来,使其成为自己的元素。最后,我需要将描述作为第三个元素保持得体
我认为awk或sed都有能力做到这一点,但尚未能够正确地对元素进行分组。非常感谢您的帮助
以下是我迄今为止尝试过的一些方法:
pkg_info -a | awk -F'[[:space:]]*' '{print $1}' | awk -F- '{$NF=" "$NF;sub(/ /,"-")}1'
输出:
yaesu- 0.13nb1
skk-jisyo cdb 201212
dbskkd-cdb 2.00nb1
libchewing- 0.2.7
skk-jisyo 201212
autoconf- 2.69nb2
pkg-config 0.28
python27- 2.7.5
及
输出:
yaesu0.13nb1
skkjisyo
dbskkdcdb
libchewing0.2.7
skkjisyo
autoconf2.69nb2
pkgconfig
python272.7.5
我已经能够使用2个命令分离出包名和版本,但这不是我想要/需要的。这些仅供参考。
这将使我自己获得版本:
pkg_info -a | awk -F'[[:space:]]*' '{print $1}' | awk -F- '{print $NF }'
pkg_info -a | awk -F'[[:space:]]*' '{print $1}' | sed 's/\(.*\)\(-.*\)/\1/g'
这将自动获取包名:
pkg_info -a | awk -F'[[:space:]]*' '{print $1}' | awk -F- '{print $NF }'
pkg_info -a | awk -F'[[:space:]]*' '{print $1}' | sed 's/\(.*\)\(-.*\)/\1/g'
我需要的最终输出是$pkgname\t$version\t$description\n
这将由\t
选项卡分隔
对于最复杂的示例,输出为:
skk jisyo cdb\t201212\t skk的字典集合\n
您可以在字段1上使用默认字段分隔符和拆分功能。然后只需将字段分隔符和拆分的最后一项附加到第一个字段:
awk '{n=split($1, a, "-"); $1=$1 FS a[n]}1'
您没有提供足够的细节来确定,但这可能是您想要的:
$ sed -r 's/([^[:blank:]]+)-([^[:blank:]]+)[[:blank:]]+/\1\t\2\t/' file
yaesu 0.13nb1 Control interface for Yaesu FT-890 HF transceiver
skk-jisyo-cdb 201212 Dictionary collection for SKK
dbskkd-cdb 2.00nb1 SKK dictionary server based on cdb
libchewing 0.2.7 The intelligent phonetic input method library
skk-jisyo 201212 Dictionary collection for SKK
autoconf 2.69nb2 Generates automatic source code configuration scripts
pkg-config 0.28 System for managing library compile/link flags
python27 2.7.5 Interpreted, interactive, object-oriented programming language
将分隔符从
选项卡更改为您想要的任何分隔符。@Ed Morton,我又添加了一点说明。Orry Ed,我跳过了枪,没有再给您您要的内容。我又修改了一次。我想通过你给我的例子,我可以让它发挥作用。我现在就试试看。感谢这给了我一个输出:yaesu-0.13nb1 0.13nb1 yaesu FT-890短波收发器控制接口skk-jisyo-cdb-201212 201212基于cdb-0.2.7 0.2.7智能语音输入法库skk-jisyo-201212的skk-dbskd-cdb-2.00nb1 2.00nb1 skk字典服务器字典集对于SKK autoconf-2.69nb2 2.69nb2,生成自动源代码配置脚本pkg-config-0.28 0.28系统,用于管理库编译/链接标志python27-2.7.5 2.7.5解释、交互式、面向对象编程语言
@rayray84:这不是您想要的吗?下次写一个更清楚的问题。对不起,卡西米尔,谢谢你的意见!通过Ed Answer,我可以得到我需要的东西这对我需要的东西很有效!谢谢@Ed Morton!我只需要将OFS更改为OFS='\\t'