2014-07-12 47 views
0

我有一個文件'corpus.txt',我試圖得到只有兩個模式;一個是具體的<PLANET>其他是什麼字。其實,我需要sed在全文中搜索模式。我根本做不到,我已經閱讀了許多關於我在做什麼的作品,但是我不能連接這些sed的代碼。sed:得到兩個模式,一個在其他行之前

一個例子corpus.txt是:

aaaaaaaaaaaaaaaaaaaaaaabbbbaabb and was searching through them in 1846 the German astronomer <NAME> discovers <PLANET> and it's notable for its active and visible weather patterns bbbbbbbbbbbbbbbbsssddd in 1846 a German astronomer discovers <PLANET> and it's slightly more massive than its near-twin Uranus bbbbffaaaaaaaaaaaaaaaa

對於記錄,有5行輸入的;搜索不需要跨越行。

我需要的輸出:

<NAME> discovers <PLANET> astronomer discovers <PLANET>

我想:s/\([^ ]*\) \(discovers <PLANET>\).*/\1 \2/g

我知道sed編碼是錯誤的,但它畢竟是我由我自己了。如果我通過將結果與Unix的管道,我得到的文本和包含該模式的行中的所有行進行過濾,像這樣:

aaaaaaaaaaaaaaaaaaaaaaabbbbaabb <NAME> discovers <PLANET> and its notable for its active and visible weather patterns bbbbbbbbbbbbbbbbsssddd astronomer discovers <PLANET> and it's slightly more massive than its near-twin Uranus bbbbffaaaaaaaaaaaaaaaa

+0

我不明白你的要求。如果下一個非空白子字符串是'',您是否需要在「發現」一詞之前查找以前的非空子字符串? –

+0

沒必要。我只需要找到_any word_之前的模式'發現' – aresardido

+0

好吧,字符串'「馬塞爾:;#??發現」',你想趕上'馬塞爾'? –

回答

1

有兩件事情來解決。

  1. 首先,您想要抑制默認的「打印行」操作,這是通過-n選項完成的。
  2. 然後你想用三個字替換整個輸入行的匹配並打印出來。

因此,您可以:

sed -n 's/.* \([^ ]\{1,\} discovers <PLANET>\).*/\1/p' 
+0

它不起作用。如果我使用'sed -n'並將結果傳遞給一個新文件,這個新文件就是空的。 – aresardido

+0

好奇;我在Linux(Ubuntu 14.04)上開發/測試了代碼,並且在那裏運行正常。我剛剛在Mac OS X 10.9.4上進行了測試,逐字拷貝了數據和腳本,並且它也在我的預期中正確工作。所以,我們必須找出爲什麼它不適合你。你在哪個平臺上工作?你是否逐字複製了代碼(copy'n'paste)還是你重新輸入了代碼?我想我可能需要檢查你使用的是哪一個shell,但是它必須相當模糊才能解決這個問題(這個命令可以用於POSIX或者類似shell的shell)。 –

+0

抱歉喬納森,現在是作品,謝謝。但結果只能返回模式之前的字符,如'>發現'。 – aresardido

1

另一個命令行選項:perl的一個班輪

這是一個Perl的一個班輪一項偉大的工作。 (如果有人能告訴我爲什麼Perl是不是X,Y或Z更糟的是,他們可以從我的早餐有剩菜。)

perl -0777 -ne 'while($_=~ m/\S+ discovers <PLANET>/g){print "$&\n";}' yourfile 

說明

  • \S+匹配任何字符不是焦炭
  • discovers <PLANET>比賽的文字一個空白
  • g標誌查找所有匹配
+0

感謝您的回答,但我不知道Pearl是如何工作的,而且最重要的是要解釋我的代碼的每一行。但我將爲未來保存你的答案。 – aresardido

+0

出於好奇/懶惰,'-0777'的意義是什麼?我從來沒有需要使用它(或不知道我會從中受益)。 –

+0

這行只是你可以粘貼到你的shell命令行中的東西,它可以完成這項工作。但沒有問題,如果這不適合你,只是顯示另一種選擇。 :) – zx81

相關問題