Tengo un archivo cities
como este:
[1598] San Diego, US (inactive)
[4517] St Louis, US (inactive)
[6346] Orlando, US (inactive)
Quiero recortar los nombres de las ciudades, para tener:
San Diego
St Louis
Orlando
Esto es lo mejor que se me ocurrió:
cut -d ',' -f1 cities | cut -d ']' -f2
Pero eso todavía me deja un espacio antes de los nombres. ¿Hay un cut
comando similar que pueda usar que acepte delimitadores de varios caracteres para poder cortar ]
?
command-line
cut
Kit Sunde
fuente
fuente
tr
es útil para eliminar caracteres que no quieres.(inactive)
estado o no? Proporcione una salida de muestra.cut
para cortar cosas y puedes ver la intención del ejemplo fallido que tengo, debería ser bastante claro en el contexto. Proporcionaré una muestra para aclararla aún más. :)Respuestas:
Awk (también verifique Awk Info ) es hermoso con ese tipo de preguntas. Tratar:
Esto define un separador de campo
-F
como[],] *
, lo que significa una aparición de un corchete de cierre o una coma, seguido de cero o cualquier número de espacios. Por supuesto, puede cambiar eso para adaptarse a cualquier requisito. Lea sobre expresiones regulares.Una vez que la línea se divide, puede hacer lo que quiera con el resultado dividido. Aquí, decidí imprimir el segundo campo solo con
print $2
. Tenga en cuenta que es importante utilizar comillas simples alrededor de las instrucciones awk; de lo contrario, $ 2 se sustituirá por el shell.fuente
]
No es un soporte angular. Los corchetes angulares son<>
.[]
son "corchetes" o simplemente "corchetes".Puede modificar el último
cut
en su tubería a esto:Lo anterior significa que el separador de campo es un espacio en blanco, y queremos seleccionar todos los campos a partir del segundo. La secuencia completa se convierte en:
fuente
Para un análisis más complejo, debe usar sed (1) :
O usando
-r
para simplificar la expresión regular, como lo sugiere pepoluan :fuente
Normalmente uso Perl cuando las cosas se ponen demasiado difíciles para sed y grep.
Hay varias formas de escribirlo en Perl. Por ejemplo, es posible que prefiera que sea rápido o que prefiera manejar problemas leves e inesperados en la entrada (por ejemplo, dos espacios donde se esperaba uno).
Una forma obvia (supone que la identificación es numérica, la ciudad es alfabética, el estado es alfabético):
O más lento pero más permisivo (hace más retroceso):
O más rápido (el campo se detiene en la primera aparición del corchete de cierre):
Desde la línea de comandos en lugar de un script, puede usar la
-n
opción, que básicamente agrega elwhile (<>) { BLOCK }
bucle:o si desea que el uso se parezca al corte, puede usar la
-F
opción, que es similar a la-F
opción de awk , por ejemplo:De esta manera, obviamente, se supone que ningún campo contendrá ninguno de los delimitadores.
fuente