Intereting Posts
Какими процессами порты (в качестве конечных точек связи) относятся к пересылке портов SSH? Как установить проприетарные драйверы nvidia на Fedora 23? Как использовать правила syn proxy и connlimit с помощью iptables? как сказать lxc, чтобы не использовать / usr / share / lxc / templates для создания контейнера linux AWK: где моя ошибка? mount не печатает установленные разделы NFS монтирует изменения в локальных разрешениях на изменение файловой системы, экспортированных в NFS, на удаленном монтировании NFS Почему мой хост-компьютер не может подключиться к моей виртуальной гостевой машине по протоколу HTTP? Как запустить Tunefs в корневой файловой системе во FreeBSD? Как переместить один порт на другой (на одном компьютере)? Имеет ли процесс, который не является процессом оболочки, переменными оболочки? Удалите строки в упрощенном файле csv (одна новая строка в строке) на основе определенного значения столбца Почему так много виртуальных терминальных устройств? Крепление KDE CIFS. Может копировать файлы с помощью mc, но дельфин не будет Как найти все шестнадцатеричные числа между двумя номерами

Почему это добавляет пробелы? echo "x ax" | sed 's / x \ s * / x /'

Я хочу найти x и заменить 0 или более следующих пробелов ( \s* ) только одним пробелом.

 echo "x ax" | sed 's/x\s*/x /' 

По какой-то причине вместо замены пробелов единственным пространством он просто добавляет одно пространство, сколько бы там ни существовало:

 x ax 

Использование + вместо * кажется абсолютно ничем, независимо от моего использования флага -E .

Похоже, что sed не делает не жадных выражений, так почему же это * потребляет все пробелы при сопоставлении?

Я – ниндзя регулярного выражения в настройках без bash, но bash и его инструменты съедают меня живым. Я понятия не имею, как кратко сформулировать это для успешного поискового запроса.

sed ожидает базовое регулярное выражение (BRE). \s не является стандартной специальной конструкцией в BRE (и в ERE , если на то пошло), это расширение некоторых языков, в частности Perl (что многие другие подражают). В sed, в зависимости от реализации, \s либо обозначает буквенную строку \s либо для буквенного символа s .

В вашей реализации кажется, что \s соответствует s , поэтому \s* соответствует 0 или более s , а x\s* соответствует x в вашем примере ввода, поэтому x ax преобразуется в x axxy будет преобразован в xy и так далее). В других реализациях (например, с GNU sed), \s соответствует \s , поэтому \s* соответствует обратному косую черту, за которой следуют 0 или более s , что не встречается на вашем входе, поэтому строка не изменяется.

Это не имеет ничего общего с жадностью. Жадность не влияет на то, соответствует ли строка регулярному выражению, только какая часть строки захватывается совпадением.

Я думаю, что вы смешиваете свои sed и grep флаги. -E – это флаг grep для расширенных регулярных выражений. -r – это флаг sed для расширенных регулярных выражений. Для меня работает следующее:

 echo "x ax" | sed -r 's/x\s*/x /' 

Он производит

 x ax