Estaba dividiendo la salida de id
para proporcionar una lista de grupos de línea por lista más legible de los cuales un usuario es miembro:
id roaima | sed 's/,/\n\t/g'
uid=1001(roaima) gid=1001(roaima) groups=1001(roaima)
24(cdrom)
25(floppy)
...
822413650 (international (uk) location)
Quería separar el número de grupo de su nombre entre corchetes, así que extendí la expresión de esta manera
id roaima | sed -e 's/,/\n\t/g' -e '2,$s/(/ (/'
Sin embargo, esto no actuó como esperaba inicialmente. La segunda expresión parecía no tener efecto.
En cambio, para obtener el resultado que quería, necesitaba ejecutar dos 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 qué necesito dos sed
comandos en una tubería en lugar de uno con varias instrucciones? O si puedo hacer esto con uno sed
, ¿cómo lo haría?
Lo que me gustaría particularmente es tener un espacio único entre el valor UID / GID y su nombre entre corchetes para cada elemento (incluidos el UID y GID en la primera línea), pero la advertencia es que en mis datos reales puedo tener grupos que contienen corchetes en sus nombres y no quiero que los nombres mismos sean destrozados.
-vRS=,
o-054
podria ayudar.Si tiene GNU sed, podría usar
que agrega un espacio antes del cuarto y paréntesis abiertos posteriores, luego reemplaza las comas.
fuente
international (uk) location
, al insertar un espacio no deseado en el nombre mismo.s/\([[:digit:]]\+\)(/\1 (/4g
que solo agregará un espacio si hay dígitos antes del paréntesis.Lo que dijo @ stéphane-chazelas es cierto, pero siempre puedes agregar el espacio primero y dividirlo en líneas después de esto:
O en un solo script sed (sin
-e
):Normalmente usamos "
/
" como separador de búsqueda (s) de comandos, pero también acepta cualquier carácter, por lo que a veces es más fácil de leer usando otros caracteres como ":
" para evitar combinaciones como "/\
".fuente