我有一个如下段落
你好,这是pattern1 = somedata和pattern2 = someotherdata和 之后的其他东西以及pattern3 = data_again和 pattern4 = wellstilldata,仅此而已。
我可以使用
提取这些模式值sed -r 's/.*pattern1=([^ ,]+).*pattern2=([^ ,]+).*pattern3=([^ ,]+).*pattern4=([^ ,]+).*/\1\t\2\t\3\t\4/' file.txt
但是在某些情况下,模式将处于随机位置,我的意思是没有条件因此总是pattern1应该首先出现而pattern4应该最后出现而模式字符串可能不是模式总是但它将是其中之一在上面的sed逻辑中给出模式。他们的立场可能会有所不同,但我从段落中提取多个字段的逻辑只有在按顺序排列时才有效,否则我每次都必须按顺序重新排列。
但有没有我们可以修改上面的逻辑来工作,不管模式的位置如何,字符串不是"模式"永远,但他们将在我的sed逻辑。
谢谢。
答案 0 :(得分:2)
使用grep
和look-behind zero-width assertion:
grep -Po '(?<=pattern1=)[^ ,]+|(?<=pattern2=)[^ ,]+|(?<=pattern3=)[^ ,]+|(?<=pattern4=)[^ ,]+' file
测试输入:
您好,这是pattern1 = somedata以及此后的其他内容以及pattern3 = data_again和pattern4 = wellstilldata pattern2 = someotherdata,仅此而已。
输出:
somedata
data_again
wellstilldata
someotherdata
答案 1 :(得分:1)
使用此正则表达式:
(pattern1=([^ ,]+)|pattern2=([^ ,]+)|pattern3=([^ ,]+)|pattern4=([^ ,]+))
请参阅此Regex101.com
使用竖线字符,无论顺序如何,您都可以匹配pattern1或2或3 ......
答案 2 :(得分:1)
假设您希望按顺序将顺序排列的模式输出分开,您可以将匹配的行填充到保留空间中,然后按顺序处理每个模式:
<强> sed -r -e 'h;s/.*pattern1=([^ ,]+).*/\1\t/;G;s/\n.*pattern2=([^ ,]+).*$/\1\t/;G;s/\n.*pattern3=([^ ,]+).*$/\1\t/;G;s/\n.*pattern4=([^ ,]+).*$/\1\t/;'
强>
$ echo blahpattern2=pat2,blahpattern1=pat1 blahpattern4=pat4,pattern3=pat3 blah | sed -r -e 'h;s/.*pattern1=([^ ,]+).*/\1\t/;G;s/\n.*pattern2=([^ ,]+).*$/\1\t/;G;s/\n.*pattern3=([^ ,]+).*$/\1\t/;G;s/\n.*pattern4=([^ ,]+).*$/\1\t/;' pat1 pat2 pat3 pat4
h
在保留空间中保留该行s/.*pattern1=([^ ,]+).*/\1\t/
用pat1\t
G
附加原始行s/\n.*pattern2=([^ ,]+).*$/\1\t/
在模式空间中换行后,用pat2\t
按照处理顺序为您提供模式。