Я разделил вывод, id
чтобы обеспечить более читаемый построчный список групп, членом которых является пользователь:
id roaima | sed 's/,/\n\t/g'
uid=1001(roaima) gid=1001(roaima) groups=1001(roaima)
24(cdrom)
25(floppy)
...
822413650 (international (uk) location)
Я хотел отделить номер группы от имени в скобках, поэтому я расширил выражение следующим образом
id roaima | sed -e 's/,/\n\t/g' -e '2,$s/(/ (/'
Однако, это не действовало, как я первоначально ожидал. Второе выражение, казалось, не имело никакого эффекта.
Вместо этого, чтобы получить желаемый результат, мне нужно было выполнить две отдельные sed
команды, например:
id roaima | sed -e 's/,/\n\t/g' | sed '2,$s/(/ (/'
uid=1001(roaima) gid=1001(roaima) groups=1001(roaima)
24 (cdrom)
25 (floppy)
...
822413650 (international (uk) location)
Зачем мне нужны две sed
команды в конвейере, а не одна с несколькими инструкциями? Или, если я могу сделать это с одним sed
, как бы я это сделал?
Что мне особенно хотелось бы, так это иметь один пробел между значением UID / GID и его именем в скобках для каждого отдельного элемента (включая UID и GID в первой строке), но предостережение заключается в том, что в моих реальных данных я могу иметь группы содержащие скобки в своих именах, и я не хочу, чтобы имена сами были искажены.
-vRS=,
или-054
может помочь.Если у вас есть GNU sed, вы можете использовать
который добавляет пробел перед 4-й и последующими открытыми скобками, а затем заменяет запятые.
источник
international (uk) location
, путем вставки нежелательного пробела в само имя.s/\([[:digit:]]\+\)(/\1 (/4g
который будет добавлять пробел только если есть цифры перед скобкой.То, что сказал @ stéphane-chazelas, верно, но вы всегда можете сначала добавить пробел и разбить на строки после этого:
Или в одном сценарии sed (без
-e
):Обычно мы используем "
/
" в качестве разделителя командного поиска (й), но он также принимает любой символ, поэтому иногда легче читать, используя другие символы типа ":
", чтобы избежать комбинаций типа "/\
".источник