如何匹配单词并忽略多个空格?

如何匹配单词并忽略多个空格?

以下语法应该匹配“Ambari Server running”,但是如果单词之间有多个空格,如何匹配?如何忽略单词之间的空格?

echo "Ambari Server      running"  | grep -i "Ambari Server running"
echo "Ambari     Server running"   | grep -i "Ambari Server running"
echo "     Ambari Server running"  | grep -i "Ambari Server running"

预期结果应该是:

Ambari Server running
Ambari Server running
Ambari Server running

答案1

tr与它的选项一起使用-s将连续空格压缩为单个空格,然后grep结果:

$ echo 'Some   spacious  string' | tr -s ' ' | grep 'Some spacious string'
Some spacious string

然而,这不会完全消除侧翼空间,只会将它们压缩成两端的单个空间。

用于sed删除侧翼空格并将内部空格压缩为单个空格:

echo ' Some   spacious  string' |
sed 's/^[[:blank:]]*//; s/[[:blank:]]*$//; s/[[:blank:]]\{1,\}/ /g'

然后可以将其传递给grep.

答案2

使用正则表达式运算符+来指示一个或多个前面的标记,在本例中为空格。所以模式是\+

echo "Ambari Server      running"  | grep -i "Ambari \+Server \+running"

[:blank:]如果您不确定,我建议使用字符类来匹配任何水平空白,而不仅仅是普通空格:

echo "Ambari Server      running"  | grep -i "Ambari[[:blank:]]\+Server[[:blank:]]\+running"

另一方面,如果您只想在单词之间保留一个空格,请使用awk

echo "Ambari Server      running"  | \
    awk '$1=="Ambari" && $2=="Server" && $3=="running" {$1=$1; print}'
  • $1=="Ambari" && $2=="Server" && $3=="running"匹配所需的三个字段

  • {$1=$1}使用空格作为新分隔符重建记录

  • {print}打印记录

答案3

如果您只想忽略之间的所有空格,则可以使用echo your text |tr -d [[:space:]]| grep "yourtext",但输出不会有任何空格。例子:

echo "Hi This   Is Test" |tr -d [[:space:]] |grep HiThisIsTest

输出:

HiThisIsTest

答案4

回答How to match words and ignore multiple spaces?类似以下内容的主要问题将帮助您获得所需的内容:

echo "Ambari Server      running"  | tr '[:upper:]' '[:lower:]' | grep -E '\s*ambari\s+server\s+running\s*'

它接受输入并使其小写,然后搜索小写的匹配项。我们使用\s*0 个或多个空白(因此将包括制表符等)以及\s+1 个或多个空白。

如果您的输入位于如下文件中foo2.txt

Ambari Server      running 
Ambari     Server running
     Ambari Server running

然后你可以做类似的事情:

cat foo2.txt | tr '[:upper:]' '[:lower:]' | grep -E '\s*ambari\s+server\s+running\s*'
ambari server      running
ambari     server running
     ambari server running

如果您只对计数感兴趣,可以将其稍微修改为:

cat foo2.txt | tr '[:upper:]' '[:lower:]' | grep -E '\s*ambari\s+server\s+running\s*' | wc -l

相关内容