2015-10-06 61 views
1

我有一個包含5000多行的文件。我需要前後串後添加下列字符,JAMES,例如:將文本添加到vim中一行的開頭和結尾處

'[^-_.*]JAMES[@-\.]' 

這是正確的,如果我想說,詹姆斯可以在一行的開頭,或有破折號,下劃線,詹姆斯之前的任何人物可以有0次或更多次,而詹姆斯可以跟隨@,短劃線或時期嗎?

我使用列表作爲白名單來打印具有特定字符串(例如JAMES)的電子郵件到另一個文件。因此,它應該採取:

cat file.txt | egrep -e -i < whitelist | sort -u > newfile.txt 

file.txt以新行分隔的電子郵件地址。

到目前爲止,我以前在vim以下命令:

'%s/^$/[^-_.*]' 

然而,這一切做的是添加[^-_.*]到文件的末尾。

回答

0

你可能想是這樣的:

:g/.*/s//^[-_.]*&[[email protected]]*/ 

.*看起來整條生產線,並:g/.*/將查找該文件中的每一行。所述s//X&Y/替換什麼g//實測值(整行)與X,什麼被發現,並Y,除了X是:

^[-_.]* 

這意味着線後跟更短劃線零開始,下劃線或點和Y是:

[[email protected]]* 

這意味着零個或多個短劃線,在招牌,或點。如果需要錨定到行尾,請在*之後添加$

注意,-必須出現在字符類「第一」(除非另一個字符必須首先出現,如^否定字符類,或]以匹配接近括號)。

+0

確實有必要在有'.'(任何字符)匹配器時添加'-'和'_'?我認爲在這種情況下不需要括號表達式。如果我錯了,請糾正我。 – limekin

+0

@limekin:在一個字符類中,'.'只是另一個字符。除了'^',''''和'-'(有時也包括''''''''),大多數字符在字符類中會失去特殊行爲。我認爲'''在角色類中獲得特殊含義會更準確。 –

+0

奇怪的是,文件中有很多行使用>'cat file | egrep -I -f白名單| tee newfile「似乎在工作,直到它到達字母表的低位字母。然後,與我的白名單中的任何名稱不匹配的行都會漏掉。有什麼我可以添加到白名單來阻止? – technerdius

相關問題