lê primeiro elemento no array

1
defaults read -g AppleLanguages

produz algo assim:

(
en,
de
)

Gostaria de extrair apenas o primeiro elemento, neste caso "en",

defaults read -g AppleLanguages | awk '/\(/ , /,/'

mas o awk sempre inclui os padrões de pesquisa. O que posso fazer para produzir apenas "en"?

    
por pkpowell 30.01.2015 / 13:36

2 respostas

3

Você poderia imprimir a segunda linha. Você pode usar muitas ferramentas para isso:

  • sed

    defaults read -g AppleLanguages | sed -n '2s/,//p;' file 
    

    Explicação : O 2 significa "executar os seguintes comandos apenas na segunda linha". O -n suprime a saída normal (nada é impresso, a menos que seja explicitamente solicitado). A substituição ( s/// ) exclui a vírgula e a /p no final imprime as linhas onde a substituição ocorreu.

  • perl

    defaults read -g AppleLanguages | perl -ne 's/,// && print if $.==2'
    

    Explicação : remova a primeira vírgula ( s/,// ) e imprima a linha se o número da linha atual ( $. for 2. O -n significa "ler o arquivo de entrada linha por linha e aplique o script dado por -e a cada linha.

  • Ferramentas Unix

    defaults read -g AppleLanguages | head -n 2 | tail -n 1 | tr -d ,
    

    Explicação : head -n 2 imprime as duas primeiras linhas, tail -n 1 imprime a última (portanto, a segunda do arquivo) e tr -d , exclui vírgulas.

  • awk

    defaults read -g AppleLanguage | awk 'NR==2{sub(",","");print}' 
    

    Explicação: NR==2{} significa "executar o que está entre parênteses apenas na segunda linha. gsub(",","") elimina a primeira vírgula.

por 30.01.2015 / 14:33
2

Você pode fazer o seguinte:

awk -F, '/[^(]/{print $1;exit}'

Explicação:

  • -F, : trata , como separador de campos
  • [^(] : para linhas que contêm pelo menos um caractere não ( .
  • print $1; exit : imprime o primeiro campo e sai imediatamente do awk (portanto, somente a primeira linha que corresponde ao padrão será impressa)
por 30.01.2015 / 13:56