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

yae*_*ael 8 grep bash sed awk shell-script

下面的语法应该匹配“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"
Run Code Online (Sandbox Code Playgroud)

预期的结果应该是:

Ambari Server running
Ambari Server running
Ambari Server running
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 9

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

$ echo 'Some   spacious  string' | tr -s ' ' | grep 'Some spacious string'
Some spacious string
Run Code Online (Sandbox Code Playgroud)

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

使用sed去除侧翼空白以及压缩内部空白,以单个空格:

$ echo 'Some   spacious  string' | tr -s ' ' | grep 'Some spacious string'
Some spacious string
Run Code Online (Sandbox Code Playgroud)

然后可以将其传递给grep.


hee*_*ayl 6

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

echo "Ambari Server      running"  | grep -i "Ambari \+Server \+running"
Run Code Online (Sandbox Code Playgroud)

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

echo "Ambari Server      running"  | grep -i "Ambari[[:blank:]]\+Server[[:blank:]]\+running"
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • {print} 打印记录