我有几个字符串(或目录中的文件名),我需要按第二种最常见的模式对它们进行分组,然后我将按每个组迭代它们并处理它们.在下面的示例中,我需要Accept中的2和Basic_Regis中的2,基本上是从字符串开始到连字符(-)和it could be any character and not just digit之后的一个字符.第一种最常见的模式是Accept和Basic_Regis.我正在寻找使用grep-Po(Perl和Only-Match)的第二常见模式.AWK解决方案正在发挥作用

输入

ACCEPT-zABC-0123
ACCEPT-zBAC-0231
接受-1ABC-0120
接受-1CBA-0321

BASIC_REGIS-2ABC-9043
BASIC_REGIS-2CBA-8132
BASIC_REGIS-PCCA-6532
BASIC_REGIS-PBBC-3023

输出量

ACCEPT-z
接受-1

BASIC_REGIS-2
BASIC_REGIS-P

echo "ACCEPT-0ABC-0123"|grep -Po "\K^A.*-"

结果:Accept-0ABC-

但我需要:接受-0

不过,awk解决方案正在发挥作用

echo "接受-1ABC-0120"|awk '$0 ~ /^A/{print substr($0,1,index($0,"-")+1)}'

接受-1

推荐答案

你不需要-P(PCRE),只需要一个普通的、老的BRE:

$ grep -o '^[^-]*-.' file | sort -u
ACCEPT-0
ACCEPT-1
BASIC_REGIS-2
BASIC_REGIS-9

或者单独使用GNU awk:

$ awk 'match($0,/^[^-]*-./,a) && !seen[a[0]]++{print a[0]}' file
ACCEPT-0
ACCEPT-1
BASIC_REGIS-2
BASIC_REGIS-9

或任何一只鹰:

$ awk '!match($0,/^[^-]*-./){next} {$0=substr($0,1,RLENGTH)} !seen[$0]++' file
ACCEPT-0
ACCEPT-1
BASIC_REGIS-2
BASIC_REGIS-9

Linux相关问答推荐

如何确定Linux上的最大静态TLS(线程本地存储)块大小?

BASH-SCRIPT-在特定行合并两个文件

在Groff mm中定义页眉不会更改第一页中的页眉

如何创建一堆文件中所有单词的列表?

为什么在已连接的设备上调用 btmgmt conn-info 返回:状态 0x02(未连接)

从 ALSA USB 硬件设备获取 USB 设备文件路径

如何添加Linux格式的时间输出

使用 bash 命令将文件从子文件夹复制到另一个

bind(): "无法分配请求的地址"

如何在vim中使用正则表达式来切换文件中所有字符的大小写

从 Ansible 中的 shell 命令输出中提取特定数据

问题:Virtio rpmsg 总线 virtio0:收到的 msg 没有收件人 - 在 Yocto Hardknott - imx7d-pico

Stripping linux 共享库

是否可以使用 shell 脚本递归地创建文件夹?

如何更改目录中所有文件中所有出现的单词

如何有效地使用 grep?

Vagrant chicken-and-egg:与 uid = apache 用户共享文件夹

从 FTP 服务器下载所有文件

`cd //` 中的双斜杠 // 在 Linux 中是什么意思?

编辑文件时保留 samba 共享的文件权限