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

Это потому что Ваш root у пользователя есть другой путь.

sudo echo $PATH

печатает Ваш путь. Именно Ваша оболочка делает переменное расширение, прежде sudo запускается (и передает его как параметр командной строки, расширенный).

Попытка:

sudo sh -c 'echo $PATH'
4
06.02.2013, 01:36
2 ответа

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

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

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

12
27.01.2020, 20:46
  • 1
    я верю Вам, является самым корректным. Я попробовал, по-видимому, каждую комбинацию класса символов, о котором я мог думать, но использование литерального пространства заставляет этот regex работать с версией sed Я использую. То, что поражает, однако, является использованием допустимого флага -E в этой системе для включения ДО я также не могу успешно использовать [:space:], который мой man re_format говорит приемлемо. Только литерал '' работает здесь. –  Tim 06.02.2013, 02:34
  • 2
    @Tim, Какую sed реализацию Вы используете? Вы писали x[[:space:]] и нет x[:space:]? А-ч –  Gilles 'SO- stop being evil' 06.02.2013, 02:45

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

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

Это производит

x ax
1
27.01.2020, 20:46
  • 1
    Гул. Я понимаю запоздало это BSD sed страницы справочника смотрят довольно другое право о теперь. -r не допустимый флаг в этой системе. Я должен перегруппировать и выяснить то, что произошло. –  Tim 06.02.2013, 02:15
  • 2
    @Tim Stephen относится к флагам GNU grep. –  Gilles 'SO- stop being evil' 06.02.2013, 02:23

Теги

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