2016-04-15 110 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命令保留的行。