使用shell脚本在模式前后选择一个单词(Hyphen是模式)。
Out是一个包含数百行的文本文件,我已经选择了那些需要ID的行,但是我需要选择字母表-数字。字母表数和数目各不相同。
我尝试过各种实用程序,包括cut、sed、awk,但是它正在修剪所需的字段。
输入
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输出应该是
BUG-101
ABC-10
DEF-10327
ABC-1043
DEF-11234发布于 2021-02-04 09:34:47
您可以使用
grep -oE '[[:alpha:]]+-[0-9]+' fileo选项只使grep输出匹配,E启用POSIX语法(不需要转义+),[[:alpha:]]+-[0-9]+匹配以一个或多个字母开头的所有子字符串,然后有一个-字符,然后有一个或多个数字。
替代品
上面的解决方案提取all,多个匹配,即使它们发生在文件中的同一行。如果您不想要这种行为,并且只想在行尾匹配<letters>-<digits>,那么只需在regex模式的末尾添加$并使用
grep -oE '[[:alpha:]]+-[0-9]+$' file`如果您需要来提取行尾的每一行上的最后一次事件,请使用基于PCRE的正则表达式和GNU grep或pcregrep (如果您安装了它,这是一个具有非GNU grep版本的通用解决方案工具):
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+。
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"输出:
BUG-101
ABC-10
DEF-10327
ABC-1043
DEF-11234发布于 2021-02-04 09:33:34
你能试一下吗。用GNU awk中显示的示例编写并测试。
awk 'match($0,/[a-zA-Z]+-[0-9]+$/){print substr($0,RSTART,RLENGTH)}' Input_file解释:添加了上面的详细说明。
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.发布于 2021-02-04 10:14:36
我喜欢使用grep和awk的方法,但是由于您也标记了sed,所以可以使用以下方法来完善您的答案选择:
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中的数据,您应该可以:
$ sed -E 's/^.*(\b[[:alpha:]]+-[[:digit:]]+).*$/\1/' file
BUG-101
ABC-10
DEF-10327
ABC-1043
DEF-11234https://stackoverflow.com/questions/66042859
复制相似问题