Как сопоставить слова и игнорировать несколько пробелов?

Решение
  1. sudo systemctl изолировать multi-user.target
  2. sudo apt-get purge xserver-xorg-video-nouveau && sudo apt-get install nvidia-current
  3. sudo systemctl изолировать graphical.target

После изоляции graphical.target дайте мне знать, что вы видите. Я не могу сказать вам почему, но похоже, что драйвер nouveau не был полностью удален. В качестве дополнительного шага вы можете занести модули в черный список .

Согласно комментариям, теперь вам необходимо обновить BIOS видео. Примечание: HOWTO: Flash BIOS, The Ubuntu Way может помочь, но вы будете использовать обновления видео BIOS вместо простых обновлений BIOS.

2
01.03.2018, 23:59
4 ответа

Используйте 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.

9
27.01.2020, 21:49

Если вы просто хотите игнорировать все пробелы между ними, вы можете использовать echo your text |tr -d [[:space:]]| grep "yourtext", но в выводе не будет места. Пример:

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

Вывод:

HiThisIsTest
1
27.01.2020, 21:49

Чтобы ответить на главный вопрос 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
0
27.01.2020, 21:49

Используйте оператор Regex +, чтобы указать один или несколько предшествующих токенов, в данном случае пробел. Таким образом, шаблон будет\+:

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}распечатывает запись

6
27.01.2020, 21:49

Теги

Похожие вопросы