web-dev-qa-db-ja.com

単語を照合して複数のスペースを無視する方法は?

次の構文は「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
3
yael

trとその-sオプションを使用して、連続するスペースを単一のスペースに圧縮し、その結果をgrepにします。

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

ただし、これは隣接するスペースを完全に削除するのではなく、どちらか一方の端で単一のスペースに圧縮するだけです。

5
Kusalananda

正規表現演算子+を使用して、前のトークンの1つ以上、この場合はスペースを示します。したがって、パターンは\+になります。

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

よくわからない場合は、プレーンなスペースだけでなく、すべての水平方向の空白に一致する文字クラス[:blank:]を使用することをお勧めします。

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

一方、単語間にスペースを1つだけ残したい場合は、awkを使用します。

echo "Ambari Server      running"  | \
    awk '$1=="Ambari" && $2=="Server" && $3=="running" {$1=$1; print}'
  • $1=="Ambari" && $2=="Server" && $3=="running"は、目的の3つのフィールドに一致します

  • {$1=$1}は、スペースを新しいセパレータとして使用してレコードを再構築します

  • {print}はレコードを出力します

5
heemayl

間のすべてのスペースを無視したい場合は、echo your text |tr -d [[:space:]]| grep "yourtext"ですが、出力にはスペースがありません。例:

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

出力:

HiThisIsTest
1
smhquery

How to match words and ignore multiple spaces?の主な質問に答えるには、次のようなものが必要なものを取得するのに役立ちます。

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

入力を受け取って小文字にしてから、小文字の一致を検索します。 0以上の空白(タブなどを含む)には\s*を使用し、1つ以上の空白には\s+を使用します。

入力が以下の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
0
VenomFangs