Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex awk分组和拆分多个分隔符_Regex_Shell_Awk_Sed - Fatal编程技术网

Regex awk分组和拆分多个分隔符

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

我试图在多个分隔符上拆分一行,并将输出分组为可以重新排序的单个元素。我在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
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'