首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shell脚本上选择模式前后的单词(Hyphen是模式)

在shell脚本上选择模式前后的单词(Hyphen是模式)
EN

Stack Overflow用户
提问于 2021-02-04 09:32:15
回答 6查看 556关注 0票数 5

使用shell脚本在模式前后选择一个单词(Hyphen是模式)。

Out是一个包含数百行的文本文件,我已经选择了那些需要ID的行,但是我需要选择字母表-数字。字母表数和数目各不相同。

我尝试过各种实用程序,包括cut、sed、awk,但是它正在修剪所需的字段。

输入

代码语言:javascript
复制
cat out | grep "[A-Z][-][0-9]"
BUG-KEYWORD-BUG-101
ABC-10
DEF-10327
Output is referred in ABC-1043
Please refer DEF-11234

输出应该是

代码语言:javascript
复制
BUG-101
ABC-10
DEF-10327
ABC-1043
DEF-11234
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2021-02-04 09:34:47

您可以使用

代码语言:javascript
复制
grep -oE '[[:alpha:]]+-[0-9]+' file

o选项只使grep输出匹配,E启用POSIX语法(不需要转义+),[[:alpha:]]+-[0-9]+匹配以一个或多个字母开头的所有子字符串,然后有一个-字符,然后有一个或多个数字。

替代品

上面的解决方案提取all,多个匹配,即使它们发生在文件中的同一行。如果您不想要这种行为,并且只想在行尾匹配<letters>-<digits>,那么只需在regex模式的末尾添加$并使用

代码语言:javascript
复制
grep -oE '[[:alpha:]]+-[0-9]+$' file`

如果您需要来提取行尾的每一行上的最后一次事件,请使用基于PCRE的正则表达式和GNU greppcregrep (如果您安装了它,这是一个具有非GNU grep版本的通用解决方案工具):

代码语言:javascript
复制
grep -oP '^(?:.*\P{L})?\K\p{L}+-\d+' file
pcregrep -o '^(?:.*\P{L})?\K\p{L}+-\d+' file

这个regex演示。在PCRE模式中,\p{L}匹配任何字母(您也可以使用[[:alpha:]] ),\d匹配任何ASCII数字,^(?:.*\P{L})?\K匹配字符串的开始(^),然后是除换行字符之外的任何零或多个字符的可选序列,尽可能多的字符(.*),然后是字母(\P{L})以外的任何字符,这一部分使引擎进入到最后一次匹配\p{L}+-\d+

主要解决方案在线演示

代码语言:javascript
复制
s='BUG-KEYWORD-BUG-101
ABC-10
DEF-10327
Output is referred in ABC-1043
Please refer DEF-11234'
grep -oE '[[:alpha:]]+-[0-9]+' <<< "$s"

输出:

代码语言:javascript
复制
BUG-101
ABC-10
DEF-10327
ABC-1043
DEF-11234
票数 1
EN

Stack Overflow用户

发布于 2021-02-04 09:33:34

你能试一下吗。用GNU awk中显示的示例编写并测试。

代码语言:javascript
复制
awk 'match($0,/[a-zA-Z]+-[0-9]+$/){print substr($0,RSTART,RLENGTH)}' Input_file

解释:添加了上面的详细说明。

代码语言:javascript
复制
awk '                               ##Starting awk program from here.
match($0,/[a-zA-Z]+-[0-9]+$/){      ##using match function to match alphabets dash and digits till last of line.
  print substr($0,RSTART,RLENGTH)   ##Printing matches sub string of matched regex.
}
' Input_file                        ##Mentioning Input_file name here.
票数 4
EN

Stack Overflow用户

发布于 2021-02-04 10:14:36

我喜欢使用grepawk的方法,但是由于您也标记了sed,所以可以使用以下方法来完善您的答案选择:

代码语言:javascript
复制
sed -E 's/^.*(\b[[:alpha:]]+-[[:digit:]]+).*$/\1/' file

其中选择了-E扩展正则表达式,然后在以下位置使用正常的替换s/find/replace/

  • find^.*(\b[[:alpha:]]+-[[:digit:]]+).*$^.*锚定在行的开头,丢弃任何类型的零或多个字符,然后捕获捕获组(...)中的文本,并将零或多个字符丢弃到行.*$的末尾,
  • 捕获组选择一个\b字边界,后面跟着一个或多个A-Za-z [:alpha:]字符,然后是'-',然后是一个或多个0-9 [:digits:]
  • replace简单地重新插入了使用第一个反向引用\1捕获的内容。

示例使用/输出

使用file中的数据,您应该可以:

代码语言:javascript
复制
$ sed -E 's/^.*(\b[[:alpha:]]+-[[:digit:]]+).*$/\1/' file
BUG-101
ABC-10
DEF-10327
ABC-1043
DEF-11234
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66042859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档