sed多个模式并删除其余

时间:2016-04-15 14:03:09

标签: bash sed

我有以下文件输出需要操作(清理)

"2016-02-29;tracking;teamA;Name;45,0;7,0;315,0;659;"this is some free text";"911 Some Category";"again #pattern2 some free text #pattern1 #pattern3"

我需要过滤并保留多个模式并清除线条的其余部分。该行应该看起来像

"2016-02-29;tracking;teamA;Name;45,0;7,0;315,0;659;"this is some free text";"911 Some Category";"#pattern2 #pattern1 #pattern3"

所以我需要操纵线的一部分并保留其余部分。

我找到了寻找多种模式的方法,比如

sed -e "s/#pattern1/#pattern1/g" -e "s/#pattern2/#pattern2/g" 

我找到了删除除模式之外的所有内容的方法:

sed -e "s/.*#pattern1.*/#pattern1/g"

编辑: 我现在的解决方案:

我用awk(delimiter;),egrep -o取出部分行并将其粘贴到原始行。看起来像这样:

#!/bin/bash
FILE=$1
REGEXP="#(pattern1|pattern2|)"
paste $FILE <( cat $FILE |awk -F';' '{print$11}' | while read a; do a=$( echo $a | egrep -io "${REGEXP}"  | sort -u ) ; echo ";"${a//$'\n'/ } ; done )

2 个答案:

答案 0 :(得分:1)

虽然sed肯定可以胜任,但我会使用grep(或egrep此处):

egrep -o "pattern1|pattern2|pattern3" inputfile | tr '\n' ' '

答案 1 :(得分:0)

您可以使用!取消匹配,也可以使用选项-n禁止自动打印。在这种情况下,您需要使用n命令显式打印要保留的行。