包含一个或多个空格或破折号的行的正则表达式
Regex for line containing one or more spaces or dashes
我得到了包含城市名称的 .txt 文件,每个城市名称都在单独的行中。有的是带一个或多个空格的少数单词或以“-”连接的单词。我需要创建 bash 命令来回显这些行。目前我正在使用 cat 与 grep 管道,但我无法在一次搜索中同时获得空格和破折号,而且我在检查多个空间。
用破折号打印行:
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
。
我得到了包含城市名称的 .txt 文件,每个城市名称都在单独的行中。有的是带一个或多个空格的少数单词或以“-”连接的单词。我需要创建 bash 命令来回显这些行。目前我正在使用 cat 与 grep 管道,但我无法在一次搜索中同时获得空格和破折号,而且我在检查多个空间。
用破折号打印行:
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 包含空白字符的行(仅 GNUgrep
)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
。