Удалить пробелы перед определенными символами

Цитирую man-страницу о login.defs

ENV_PATH (string) Если задано, то будет использоваться для определения переменной окружения PATH при входе обычного пользователя в систему. Значение представляет собой разделенный двоеточием список путей (например, /bin:/usr/bin) и может предваряться PATH=. Значение по умолчанию - PATH=/bin:/usr/bin.

ENV_SUPATH (строка) Если установлено, то будет использоваться для определения переменной окружения PATH при входе в систему суперпользователя. Значение представляет собой разделенный двоеточием список путей (например, /sbin:/bin:/usr/sbin:/usr/bin) и может быть предшествовать PATH=. По умолчанию значение равно PATH=/sbin:/bin:/usr/sbin:/usr/bin.

Оба используются для определения переменной PATH обычного, суперпользователя изначально. В моем login.defs переменные ENV_PATH, ENV_SUPATH определены следующим образом

ENV_SUPATH      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  
ENV_PATH        PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

Я добавил нового пользователя 'foo'

sudo useradd foo

sudo passwd foo                                                                                                     
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Когда я вхожу в систему как 'foo'

foo@naga-playground:/$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

Аналогично для 'root'

root@naga-playground:/home/pi/# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

PATH может быть переопределена пользователем через .bashrc, .bash_profile, .zshrc ....

Чтобы сделать ответ полным
ENV_PATH используется для определения PATH для обычного пользователя
ENV_SUPATH используется для определения PATH для суперпользователя

2
22.10.2016, 22:21
1 ответ

Использование GNU sed (которое у вас есть, потому что вы пометили этот Linux):

$ echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed -zE 's/[[:space:]]([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...

Как это работает

  • -z

    Это указывает sed читать весь текст сразу, а не читать в одной строке вовремя.

  • -E

    Указывает sed использовать расширенный синтаксис регулярных выражений. Это устраняет необходимость в некрасивых обратных косых чертах.

  • s / [[: space:]] ([,.?!]) / \ 1 / g

    Заменяет любые пробелы, за которыми следует один из , , . , ? или ! , только со знаком препинания.

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

    [[: space:]] включает не только пробелы, но также символы табуляции, новые строки и т. Д.

Вариант

Эта версия с одним или несколькими пробелами перед знаками препинания:

$ echo $'Ala ma kota   ,psa i kanarka  \n, chyba . . .' | sed -zE 's/[[:space:]]+([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...

Обсуждение

В вопросе есть:

s/ ././g

Обратите внимание, что в регулярном выражении . - это подстановочный знак: он соответствует чему угодно. Таким образом, . соответствует пробелу, за которым следует любой символ . Эти два символа заменены на . (поскольку сторона замены не регулярное выражение, . является буквальной точкой). Это не то, на что вы надеялись.

4
27.01.2020, 21:59

Теги

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