2015-08-18 52 views
3

沒有與下面的信息的文本文件:僅正則表達式匹配方括號一次

[[parent]] 

[son] 

[daughter] 

如何獲得[兒子]和[女兒]

$0 ~ /\[([a-z])*\]/  ??? 
+0

注意,'[A-Z]'不一定只匹配小寫字母,假設這是你想要的。根據您的區域設置,「[a-z]」可以匹配「aAbBcC ... yYz」或其他內容。要始終只匹配小寫字母,請改用POSIX字符類'[[:lower:]]'。 –

回答

3

你的正則表達式幾乎是正確的。只要把圓括弧內*(以具有唯一的組內的全部文本),並記得使用^$分隔符(避免匹配[[parent]]):

^\[([a-z]*)\]$ 
2

您可以使用此awk命令:

awk -F '[][]+' 'NF && !/\[\[/{print $2}' file 
son 
daughter 

awk命令分手:

-F '[][]+'  # set input field separator as 1 or more of [ or ] 
NF    # only if at least one field is found 
!/\[\[/  # when input doesn't start with [[ 
2

匹配下一個字符爲字母的行首的任何方括號。

awk '/^\[[a-z]/' file 

您可能需要爲字符類添加大寫字母和/或數字,具體取決於您的真實要求。 (你的例子只顯示小寫,所以我認爲這是一個有效的概括。)

+0

是的,我只需要小寫。謝謝! – 6axter82

1

如果一切都在自己的路線上,那麼Andrea的正則表達式將工作正常。如果在其他文本中混合使用,並且如果有[[文本]和[文本]]上的匹配消除,則應該在前面和後面查看;

(?<!\[)\[([a-z]*)\](?!\]) 

說明:

(?<!\[) # The character to the left is not [ 
\[  # One [ 
([a-z]*) # Any number of lower case letters in a capture group 
\]  # One ] 
(?!\]) # The next character is not ] 

演示:https://regex101.com/r/uQ0uC6/1