最好用awk但其他脚本可以。 ("{{{1"
在线末端用于vim折叠,应该与所需的输出无关。)示例中的数据来自在线聊天室,我将其粘贴到文本文件中。
Begin file contents:
-----------------------------------------------
/mysql unauth'd user on show processlist, plus db conn error in a site {{{1
1:05
Gary
can you ck belljar20 instance?
1:06
Justin looks like reverse dns issue
-----------------------------------------------
/mysql pingtimes to db server solved by adding domain to /etc/hosts on db server {{{1
per internal wiki
...
-----------------------------------------------
/php54 back to php52 with manual fix for https {{{1
Gary
can u force mkp44aaa.net to bind to an ip address?
...
-----------------------------------------------
:End file contents
记录,又名块(不同行数)以一个单词“/ category”作为第一行的第一个单词开头,在开始正斜杠“/”之后,以一条约40行结束破折号。上面,在3个块示例中,两个类别为“/ mysql”,另一个类别为“php54”。
在上面的示例中,我希望输出已经排序,因此两个“/ mysql”类别块在排序输出中彼此相邻。
因此,基本上,只需按类别名称对块进行排序。
我已经看到了很多解决方案的组件,但似乎找不到一个足以让我适应它的点。
答案 0 :(得分:1)
如果您可以使用perl
:
#! /bin/bash
input=/tmp/file
perl -n0le '
while (s/(\/\w+(.|\n)*?-+)//m){
$str=$1; $str=~/(\/\w+)/;
$h{$1}=[] unless exists $h{$1};
push @{h{$1}},$str;
}
END{
foreach $key (sort keys %h){
foreach ( @{$h{$key}} ){
print $_."\n";
}
}
}' $input
<强>解释强>
有很多事情要发生,首先我们想要一个多行匹配,这就是为什么我们使用-0
将输入文件的全部内容放入$_
。
然后我们想要提取我们的模式"(\/\w+(.|\n)*?-+)"
创建一个数组的哈希值,键为“/ category”。最后,我们根据该键和打印进行排序。
<强>输出:强>
bash test.sh
/aaa
this is a test
-----------------------------------------------
/mysql unauth'd user on show processlist, plus db conn error in a site {{{1
1:05
Gary
can you ck belljar20 instance?
1:06
Justin looks like reverse dns issue
-----------------------------------------------
/mysql pingtimes to db server solved by adding domain to /etc/hosts on db server {{{1
per internal wiki
...
-----------------------------------------------
/php54 back to php52 with manual fix for https {{{1
Gary
can u force mkp44aaa.net to bind to an ip address?
...
-----------------------------------------------