2013-03-17 22 views
0

我有「exp正則表達式」行的文件。該文件可以包含其他文本的行。例如:作爲grep的正則表達式的文件內容

exp [a-zA-Z].*\.sh~$ 
exp test 
tmp too 
exp tmp 
trololo 

我需要到grep這個文件的內容與egrep file '^exp ' | sed 's/^exp //'結果的是這樣的:

[a-zA-Z].*\.sh~$ 
test 
tmp 

但我需要這個grep的結果通過分離|而不是\ n

[a-zA-Z].*\.sh~$|test|tmp 

因爲我需要使用此結果作爲另一個grep正則表達式。例如打印嵌套grep匹配的文件:

ls | egrep "`egrep file '^exp ' | sed 's/^exp //'\`" 

nested grep | sed替代

ls | egrep "[a-zA-Z].*\.sh~$|test|tmp" 

或者有更好的方法從文件中導出正則表達式並將它們用於過濾器文件?

肯特:我怎麼能用這個來取代?我認爲它是:

ls | egrep "`awk '/^exp /{sub(/^exp /,"");s=(s?s"|":s) sprintf("%s",$0)}END{print s}' file`" 

但我相當錯誤。

回答

2

您可以保存grepsed,並使用單一的過程:awk一個班輪

awk '/^exp /{sub(/^exp /,"");s=(s?s"|":s) sprintf("%s",$0)}END{print s}' file 

測試了一下:

kent$ on feature at master!? echo "exp [a-zA-Z].*\.sh~$ 
exp test 
tmp too 
exp tmp 
trololo"|awk '/^exp /{sub(/^exp /,"");s=(s?s"|":s) sprintf("%s",$0)}END{print s}' 
[a-zA-Z].*\.sh~$|test|tmp 
+0

's =(s?s「|」:s)'是什麼意思?三元操作符? oO – 2013-03-17 16:22:30

+0

太好了,但現在我在替換中出現問題'' ls | egrep -v「'awk'/^exp/{sub(/^exp /,」「); s =(s?s」|「:s)sprintf(」%s「,$ 0)} END {print s} ''「 :s)sprintf(%s,bash)} END {print s}'.config':command not found 你知道是什麼造成了這種情況嗎? – 2013-03-17 16:29:53

+1

@sputnick它是一個簡短的版本:'如果s不是空的{use s itself +「|」 } else {使用s本身,它是空的}' – Kent 2013-03-17 16:31:16

3

試着這樣做:

grep '^exp ' file.txt | sed 's/^exp //' | paste -sd '|' 

,甚至更好,沒必要grepsed CAD做它本身:

sed -n '/^exp/s/^exp //p' file.txt | paste -sd '|' 

最後但並非最不重要的,如果你是開放的單行:

perl -ne 'push @arr, $1 if /^exp (.*)/;END{print join "|", @arr}' file.txt 
+0

我得不到你,我有你的樣品輸入和我的樣本輸出是一樣的樣本輸出。 – 2013-03-17 16:07:28

+0

它是我的回覆的一箇舊的誤解版本,謝謝刪除您的意見,如果你想清理的地方,謝謝。我也會這麼做 – 2013-03-17 16:17:24

+0

增加Perl版本 – 2013-03-17 16:20:40