包含一个或多个空格或破折号的行的正则表达式

Regex for line containing one or more spaces or dashes

我得到了包含城市名称的 .txt 文件,每个城市名称都在单独的行中。有的是带一个或多个空格的少数单词或以“-”连接的单词。我需要创建 bash 命令来回显这些行。目前我正在使用 catgrep 管道,但我无法在一次搜索中同时获得空格和破折号,而且我在检查多个空间。

用破折号打印行:
cat file.txt | grep ".*-.*"

打印带空格的行:
cat file.txt | grep ".*\s.*"

当我尝试这样做时:
cat file.txt | grep ".*\s+.*"
我一无所获。

感谢帮助

类似的东西应该可以工作:

grep -E -- ' |\-' file.txt

解释:

  • -E:将模式解释为扩展的正则表达式
  • --:表示命令选项结束
  • ' |\-':该行包含 space 或破折号

这并没有直接解决您的问题,但评论太多了。

您的模式中不需要 .*.* 在模式的开头或结尾是无用的,因为它表示“任何字符的 0 个或多个”,因此将始终匹配。

这些行都是相同的:

cat file.txt | grep ".*-.*"
cat file.txt | grep "-.*"
cat file.txt | grep "-"

此外,您不需要猫和管道:

grep "-" file.txt

grep模式匹配时,默认动作是打印整行,所以.*在你所有的模式都是多余的,你可以删除它们。此外,您不必使用 cat file |,因为您可以在模式之后直接将文件指定为 grep,即 grep 'pattern' file.txt.

以下是更多详细信息:

  • grep ".*-.*" = grep -- "-" - returns 任何具有 - 字符的行(-- 表示选项结束,接下来是模式)
  • grep ".*\s.*" = grep "\s" - 匹配和 returns 包含空白字符的行(仅 GNU grep
  • grep ".*\s+.*" = grep "\s+" - returns 行包含一个空格后跟一个文字 + 字符(因为你在这里使用 POSIX BRE 正则表达式未转义 + 匹配文字加号)。

你想要

grep "[[:space:]-]" file.txt

参见 online demo:

#!/bin/bash
s='abc - def
ghi
jkl mno'
grep '[[:space:]-]' <<< "$s"

输出:

abc - def
jkl mno

[[:space:]-] POSIX BRE 和 ERE(使用 -E 选项启用)兼容模式匹配任何空格(使用 [:space:] POSIX 字符 class) 或连​​字符。

请注意,[\s-] 将不起作用,因为括号表达式中的 \s 不被视为正则表达式转义序列,而仅被视为 \s