我有几根弦(或目录中的文件名),我需要按第二常见的模式对它们进行分组,然后我将按每个组对它们进行迭代并处理它们。在下面的示例中,我需要2个来自ACCEPT,2个来自BASIC_REGIS,基本上从字符串开始到连字符后的一个字符(-)和可以是任何字符,而不仅仅是数字。第一个最常见的模式是ACCEPT和BASIC_REGIS。我正在使用grep-Po(Perl和唯一匹配)寻找第二个最常见的模式。AWK解决方案正在工作
输入
ACCEPT-zABC-0123
ACCEPT-zBAC-0231
ACCEPT-1ABC-0120
ACCEPT-1CBA-0321
BASIC_REGIS-2ABC-9043
BASIC_REGIS-2CBA-8132
BASIC_REGIS-PCCA-6532
BASIC_REGIS-PBBC-3023
输出
x一个一个一个一个x一个一个二个x
结果:接受-0ABC-
但我需要:验收-0
但是awk解决方案正在工作
echo "ACCEPT-1ABC-0120"|awk '$0 ~ /^A/{print substr($0,1,index($0,"-")+1)}'
验收-1
6条答案
按热度按时间but5z9lq1#
***第一个解决方案:***使用所示示例,请尝试以下
awk
代码。***第二个解决方案:***使用GNU
grep
,请尝试以下操作。wgx48brx2#
就像这样:
输出
正则表达式匹配如下:
| 节点|解释|
| - ------|- ------|
|
^
|字符串的开头||
[^-]+
|除以下字符之外的任何字符:-
(1次或多次(匹配最大可能数量))||
-
|- -||
.
|除\n之外的任何字符|1cklez4t3#
我不太清楚你所说的"第二常见的分组"是什么意思,但是简单地重复一下这个输出:
ne5o7dgx4#
您不需要
-P
(PCRE),只需要一个简单的BRE:或者单独使用GNU awk:
或任何awk:
r1zhe5dt5#
POSIX shell 有原始参数扩展。使用此函数的含义:
与此相结合:
例如:
现在我做得很粗糙,但它应该作为一个例子,说明这个工具是多么简单和强大,特别是在与循环结合使用时。
如果您需要某种语法,现在可以简单地处理各个部分:
虽然这个答案比较长,但它比使用正则表达式更灵活和简单。想象一下,想要用正则表达式得到一个256长链的第四个模式,这是一场噩梦。
这个答案更适合于脚本,如果是临时的,grep或sed就可以了--至少对于小模式是这样。
ygya80vv6#
由于不调用
substr
,因此效率更高: