假设我有以下文本文件inputFile
:
hello
HELLO
Hello World
wOrld
asdgfsafd
abc 123
1 3 5 a b
我想使用egrep和正则表达式打印出仅包含一个单词的行(任何带有大写/小写字母的序列),无论字符之前或之后是否有空格。
所以输出应该是这样的:
hello
HELLO
wOrld
asdgfsafd
我想出的最好的正则表达式是
egrep ' *[a-zA-Z] *$' inputFile
但它似乎不起作用。有什么建议么?
答案1
您需要+
在 后面加一个[A-Za-z]
,以便正则表达式匹配 1 个或多个字母,而不是仅匹配单个字母。您还需要使用 a 锚定正则表达式的开头^
(它匹配行的开头,与$
匹配行的结尾相反)
egrep '^ *[a-zA-Z]+ *$' inputFile
您可能还想使用[[:space:]]*
而不仅仅是*
,以便匹配制表符以及空格。并[[:alpha:]]
匹配您所在区域中的所有字母字符,而不仅仅是 AZ。
egrep '^[[:space:]]*[[:alpha:]]+[[:space:]]*$' inputFile
答案2
你已经有了一个好的开始。您正在查找由一个或多个字母组成的序列,同一行(之前或之后)没有其他非空白字符。使用+
表示法,您可以表示一串由一个或多个字母组成的字符串,如 cas 所说,用[a-zA-Z]+
.
您可以通过对序列进行锚定搜索(锚定到行的开头和结尾,因此它检查整行)来满足其余要求 - 同一行上(之前或之后)没有其他非空白字符(可能为空)空格,后跟非空字母序列,然后是另一个空格序列(可能为空):
egrep '^ *[a-zA-Z]+ *$'
如果要包含标准拉丁字母表之外的字母(例如,à
、é
、ï
和ô
),并允许除空格之外的空白字符(例如制表符),请使用字符类代码:
egrep '^[[:space:]]*[[:alpha:]]+[[:space:]]*$'