Eu tenho um arquivo cities
como este:
[1598] San Diego, US (inactive)
[4517] St Louis, US (inactive)
[6346] Orlando, US (inactive)
Quero cortar os nomes das cidades, para que eu tenha:
San Diego
St Louis
Orlando
Este é o melhor que eu poderia ter:
cut -d ',' -f1 cities | cut -d ']' -f2
Mas isso ainda me deixa com um espaço antes dos nomes. Existe um cut
comando semelhante que eu possa usar que aceite delimitadores de vários caracteres para que eu possa cortar ]
?
command-line
cut
Kit Sunde
fonte
fonte
tr
é útil para excluir caracteres que você não deseja.(inactive)
status ou não? Forneça uma amostra de saída.cut
para cortar as coisas e você pode ver a intenção do exemplo que falhei, tenho que ficar bem claro no contexto. Vou fornecer amostra embora para esclarecer ainda mais. :)Respostas:
Awk (também verifique Awk Info ) é bonito com esse tipo de pergunta. Experimentar:
Isso define um separador de campo
-F
como[],] *
- o que significa uma ocorrência de um colchete de fechamento ou de uma vírgula, seguida por zero ou qualquer número de espaços. Claro que você pode mudar isso para atender a qualquer requisito. Leia sobre expressões regulares.Depois que a linha é dividida, você pode fazer o que quiser com o resultado da divisão. Aqui, decidi imprimir o segundo campo apenas com
print $2
. Observe que é importante usar aspas simples nas instruções do awk, caso contrário, $ 2 serão substituídos pelo shell.fonte
]
não é um colchete angular. Os colchetes angulares são<>
.[]
são "colchetes" ou apenas "colchetes".Você pode modificar o último
cut
no seu pipeline para isso:O texto acima significa que o separador de campos é um espaço em branco e queremos selecionar todos os campos a partir do segundo. A sequência completa se torna:
fonte
Para uma análise mais complexa, você deve usar o sed (1) :
Ou use
-r
para simplificar a expressão regular, conforme sugerido por pepoluan :fonte
Eu normalmente uso Perl quando as coisas ficam muito difíceis para sed e grep.
Existem várias maneiras de escrever no Perl. Por exemplo, você pode preferir que seja rápido, ou pode lidar com pequenos problemas inesperados na entrada (por exemplo, dois espaços onde um era esperado).
Uma maneira óbvia (assume que id é numérico, cidade é alfabética, status é alfabético):
Ou mais lento, mas mais permissivo (faz mais retrocessos):
Ou mais rápido (o campo para na primeira ocorrência do colchete de fechamento):
Na linha de comando, em vez de um script, você pode usar a
-n
opção, que basicamente adiciona owhile (<>) { BLOCK }
loop:ou se quiser que o uso se pareça com o corte, você pode usar a
-F
opção, que é semelhante à-F
opção do awk , por exemplo:Dessa maneira, obviamente, assume que nenhum campo conterá nenhum dos delimitadores.
fonte