![如何匹配单词并忽略多个空格?](https://linux22.com/image/116931/%E5%A6%82%E4%BD%95%E5%8C%B9%E9%85%8D%E5%8D%95%E8%AF%8D%E5%B9%B6%E5%BF%BD%E7%95%A5%E5%A4%9A%E4%B8%AA%E7%A9%BA%E6%A0%BC%EF%BC%9F.png)
以下语法应该匹配“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