2012-03-29 49 views
1

我有一個格式爲大的文本文件。按照某個標準匹配2個正則表達式?

english word: spanish equivalent words here; 
english word: spanish equivalent words here; 
for about 1000 lines 

我需要做的是找到了英文單詞是一樣的,除了最後一個字母「E」的西班牙語單詞的詞已經被更改爲「O」 因此,所有的英語單詞以'e'結尾,他們的西班牙語等效詞是完全相同的拼寫,除了最後一個字母是'o'而不是'e'。 我希望是有道理的:

例如,我會做出一個字

thiswordE: spanishwordO; would be returned whilst 
thisword: spanishwordO; would not 
thisword: spanishword; would also not be returned 

我試圖用隔離此:

awk '/[^e:]*e:/ && /[^o;]*o;/ {print}' a.txt 

awk '/.*(e:|o;)/ {print}' a.txt 

兩者都沒有爲我工作..有人可以幫我嗎? 或者指點我正確的方向?

也說我用awk來查找特定的表情,我將如何設置一個變量等於這個正則表達式?

例如如果我對上述文件

awk '/...:/' (so the last 3 letters before the :) 

正則表達式,並希望設置一個變量等於正則表達式的結果,我會怎麼做呢?

如果你給我一個直線上升的回答,你能解釋一下它是如何工作的嗎?

+0

家庭作業的問題,確保規定的工具或技術限制(AWK _or_ SED,或_any_ UNIX過濾器?),必須或可以使用和輸出預期如何(在這種情況下,你需要一個文本文件的結果?或者你需要有一個程序,可以將它們僅僅是輸出到屏幕上?就地修改的文件,或製作副本,並把它在其他地方?) – 2012-03-29 17:25:20

回答

2

我覺得這樣的事情應該工作(除非有一些我不知道這是特別的AWK):

([a-zA-Z]+)[eE]:\s*\1[oO];.* 

它允許所有的情況下(不帶開關),所以只是刪除大寫字母哪裏你不需要他們或你不想讓他們的地方。最後的.*允許在分號之後和換行符之前的任何內容。該\1是一個反向引用到什麼被包含在括號中的第一表達匹配,並且\s是任何空白(包括換行)

問問,如果你想了解更多的解釋。

編輯:這是一個普通的正則表達式,與awk不兼容,因爲awk不支持反向引用 - 請參閱follow-up question by the OP以澄清它在sed中的使用,而不是awk。

+0

的/ 1後向引用正是我尋找!謝謝,新的必須有這樣的事情 – Max 2012-03-29 14:36:54

+0

嗨有「代碼騎師」,不知道你是否會得到這個......但我似乎無法讓你的代碼工作。我得到一個「無效的後退引用」錯誤,我試圖在sed中實現你的代碼,因爲awk不支持反向引用。 – Max 2012-03-29 15:41:29

+0

@Max Okie doke - 我不是一個awk/sed大師(我似乎記得在過去至少使用過一次...?),並且我想_你需要反向引用來完成這個任務,但是你可以通過至少爲你的問題添加一個[tag:sed]標籤來幫助你(也許還有一個空間),並且可能用你嘗試過的某些'sed'東西來重寫或添加你的問題。我一直都在努力學習,所以我會花一些時間尋找答案,但如果我是你,我會一直試圖找出答案,並用你的發現更新你的問題,以顯示研究工作。其他人也可能會提供幫助。 – 2012-03-29 17:18:39