2016-04-15 88 views
0

我也需要被操纵的以下文件输出(清理)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) 
+1

尽管编写一个sed脚本来完成这个任务并不困难,但它可能是一团糟,还有更好的选择。 – 123

+0

编辑您的问题以包含[mcve]。就目前来看,它非常模糊。 –

+0

我认为我misexplained。问题是,我没有粘贴整条线,这导致了误解。我在问题中添加它。 – JackOverflow

回答

1

虽然sed肯定可以做的工作,我会用grep(或egrep这里):

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

感谢您的回复。该文件有很多行,只是我需要操作的整个行的一部分。对于你在这里看到的只是awk -F';' '{print $ 14}'的一行。 – JackOverflow

+0

这工作,但输出跨越多行 – sjsam

+0

@JackOverflow我不明白。为什么它不适用于多行? – pfnuesel

0

你可以否定匹配与!,你也可以自动抑制使用选项-n进行打印。在这种情况下,您需要明确地打印您希望通过n命令保留的行。