Eu estava dividindo a saída id
para fornecer uma lista mais legível de linha por lista de grupos dos quais um usuário é membro:
id roaima | sed 's/,/\n\t/g'
uid=1001(roaima) gid=1001(roaima) groups=1001(roaima)
24(cdrom)
25(floppy)
...
822413650 (international (uk) location)
Eu queria separar o número do grupo do nome entre colchetes, então estendi a expressão assim
id roaima | sed -e 's/,/\n\t/g' -e '2,$s/(/ (/'
No entanto, isso não funcionou como eu esperava inicialmente. A segunda expressão parecia não ter efeito.
Em vez disso, para obter o resultado desejado, eu precisava executar dois sed
comandos separados , como este:
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)
Por que preciso de dois sed
comandos em um pipe, em vez de um com várias instruções? Ou se eu posso fazer isso com um sed
, como eu faria?
O que eu particularmente gostaria de ter é o espaço único entre o valor UID / GID e seu nome entre colchetes para cada item (incluindo o UID e GIDs na primeira linha), mas a ressalva é que, em meus dados reais, posso ter grupos contendo colchetes em seus nomes e eu não quero que os nomes sejam mutilados.
-vRS=,
ou-054
poderia ajudar.Se você possui o GNU sed, você pode usar
que adiciona um espaço antes do quarto e parênteses abertos subsequentes e substitui as vírgulas.
fonte
international (uk) location
, ao inserir um espaço indesejado no próprio nome.s/\([[:digit:]]\+\)(/\1 (/4g
apenas um espaço se houver dígitos antes do parêntese.O que @ stéphane-chazelas disse é verdade, mas você sempre pode adicionar o espaço primeiro e dividir em linhas depois desta forma:
Ou em um único script sed (sem
-e
):Normalmente, usamos "
/
" como separador da (s) busca (s) de comando, mas também aceita qualquer caractere; portanto, às vezes é mais fácil ler usando outros caracteres como ":
" para evitar combinações como "/\
".fonte