2013-10-04 36 views
0

正則表達式所以我有一組數據,所有看起來是這樣的:使用grep

janitor#1/2 of dorm#1/1 
president#4/1 of class#2/2 
hunting#1/1 hat#1/2 
side#1/2 of hotel#1/1 
side#1/2 of hotel#1/1 
king#1/2 of hotel#1/1 
address#2/2 of girl#1/1 
one#2/1 in family#2/2 
dance#3/1 floor#1/2 
movie#1/2 stars#5/1 
movie#1/2 stars#5/1 
insurance#1/1 office#1/2 
side#1/1 of floor#1/2 
middle#4/1 of December#1/2 
movie#1/2 stars#5/1 
one#2/1 of tables#2/2 
people#1/2 at table#2/1 

有些行有介詞,別人不那麼我想我可以使用正則表達式來清理。我需要的是每個名詞,#號和它自己的行後面的數字。因此,例如,輸出的第一行應該是這樣在最後的文件:

janitor#1 
dorm#1 
president#4 
etc... 

列表存儲在一個名爲的NP文件。我的代碼是這樣做的:

cat NPs | grep -E '\b(\w*[#][1-9]).' >> test 

但是,當我打開測試時,它與輸入文件完全相同。任何關於我失蹤的信息?它似乎不應該是一個艱難的操作,所以也許我錯過了一些關於語法的東西?我從bash中調用的shell腳本使用此命令。

提前致謝!

回答

0

使用grep

$ grep -o "\w*[#]\w*" inputfile 
janitor#1 
dorm#1 
president#4 
class#2 
hunting#1 
hat#1 
side#1 
hotel#1 
side#1 
hotel#1 
king#1 
hotel#1 
address#2 
girl#1 
one#2 
family#2 
dance#3 
floor#1 
movie#1 
stars#5 
movie#1 
stars#5 
insurance#1 
office#1 
side#1 
floor#1 
middle#4 
ecember#1 
movie#1 
stars#5 
one#2 
tables#2 
people#1 
table#2 
+0

太棒了,這是比我想象的更清晰的解決方案。謝謝! – Shakesbeery

0

grep變體從文本中提取整行,如果它們匹配模式。如果您需要修改行,你應該使用sed,像

cat NPs | sed 's/^\(\b\w*[#][1-9]\).*$/\1/g' 
0

你需要sed,不grep。 (或者awk,或perl)它看起來像這樣會做你想要什麼:

cat NPs | sed 's?/.*??' 

或者乾脆

sed 's?/.*??' NPs 

s的意思是 「替代」。下一個字符是正則表達式之間的分隔符。通常它是「/」,但是因爲你需要搜索「/」,所以我用「?」代替。 「」指的是任何字符,「*」表示「零或多個先於我」。無論最後兩個分隔符是什麼,都是替換字符串。在這種情況下,它是空的,所以你要用空字符串替換「/」,後面跟零個或多個任何字符。

編輯:哦,我現在看到你想要提取最後一個項目也行。那麼,我確信其他人建議的正則表達式會起作用。如果是我的問題,我可能會分兩個步驟來過濾文件,也許會將結果從一步移到另一步,或者使用sed多次替換:首先刪除「的」和中間空格,並添加換行符,然後如上運行sed。它不像在一個正則表達式中這樣做很酷,但每一步都更容易理解。爲了更簡單和不冷酷,請使用三個步驟,在第一步中用空格替換「of」。由於其他人提供了完整的解決方案,我不會詳細解決問題。

0

默認情況下,Grep只搜索文本,所以在你的情況下它會打印匹配的行。我想你想調查sed而不是執行替換。 (你不需要cat的文件,只需grep PATTERN filename

爲了讓您在不同的行輸出,這個工作對我來說:

sed 's|/.||g' NPs | sed 's/ .. /=/' | tr "=" "\n" 

此使用兩個SEDS連續做不同換人和tr插入換行符。

grep中的-o選項會導致它僅打印出匹配的文本,如另一個答案中所述,這可能更簡單!

1

這應該做你所需要的。

-o選項將只顯示符合PATTERN的匹配行的一部分。

grep -Eo '[a-z#]+[1-9]' NPs > test 

甚至-P選項,這將解釋圖案作爲一個Perl正則表達式

grep -Po '[\w#]*(?=/)' NPs > test 
0

一種awk版本:

awk '/#/ {print $NF}' RS="/" NPs 
janitor#1 
dorm#1 
president#4 
class#2 
hunting#1 
hat#1 
side#1 
hotel#1 
side#1 
hotel#1 
king#1 
hotel#1 
address#2 
girl#1 
one#2 
family#2 
dance#3 
floor#1 
movie#1 
stars#5 
movie#1 
stars#5 
insurance#1 
office#1 
side#1 
floor#1 
middle#4 
December#1 
movie#1 
stars#5 
one#2 
tables#2 
people#1 
table#2