我有一段如下
你好,这里是pattern1=somedata和pattern2=someotherdata
在这之后还有别的东西,还有pattern3=数据
pattern4=wellstilldata,仅此而已。
我可以提取这些模式值,
sed -r 's/.*pattern1=([^ ,]+).*pattern2=([^ ,]+).*pattern3=([^ ,]+).*pattern4=([^ ,]+).*/\1\t\2\t\3\t\4/' file.txt
但在某些情况下,模式将处于随机位置,我的意思是没有这样的条件:模式1应该首先出现,模式4应该最后出现,模式串可能不是模式总是,但它将是上述sed逻辑中给定的模式之一。它们的位置可能不同,但我上面从段落中提取多个字段的逻辑只有在它们是有序的情况下才能工作,否则每次都必须按顺序重新排列它们。
但是,有没有什么我们可以修改上面的逻辑,使其工作方式与模式的位置无关,字符串并不总是“模式”,但它们将在我的sed逻辑中。
谢谢您。
最佳答案
假设您希望模式按顺序输出,并由制表符分隔,则可以将匹配的行填充到保持空间中,然后按顺序处理每个模式: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 blah pattern2=pat2,blah pattern1=pat1 blah pattern4=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/;'pattern4=pattern4=([[^,[^,]+).[[[^,]+是的
拍1拍2拍3拍4h
在保留空间中保留行s/.*pattern1=([^ ,]+).*/\1\t/
用pat1\t
替换模式空间G
追加原始行s/\n.*pattern2=([^ ,]+).*$/\1\t/
在模式空间的换行符后,将所有内容替换为pat2\t
等
按处理顺序提供模式。