使用egrep和正则表达式

使用egrep和正则表达式

假设我有以下文本文件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:]]*$'

相关内容