sed:以随机顺序提取多个字段

时间:2017-10-26 08:10:04

标签: regex bash shell sed

我有一个如下段落

  

你好,这是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逻辑。

谢谢。

3 个答案:

答案 0 :(得分:2)

使用greplook-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
  • 替换所有内容

按照处理顺序为您提供模式。