Como grep, em seguida, procurar e substituir na saída?

6

Eu tenho alguns resultados do iconv, por exemplo

$ iconv -l | grep ISO | head -5
CSISO4UNITEDKINGDOM//
CSISO10SWEDISH//
CSISO11SWEDISHFORNAMES//
CSISO14JISC6220RO//
CSISO15ITALIAN//
durrantm:~

Como posso alterar o // para, por exemplo, -- 's?

Eu tentei $ (iconv -l | grep ISO).gsub('\/\/','--') , mas sem sorte.

    
por Michael Durrant 13.09.2013 / 18:01

5 respostas

8

Existem algumas abordagens que usam tr , awk ou sed

TR:

 iconv -l | grep ISO |head -5 |tr '/' '-'

AWK:

iconv -l | awk '/ISO/{gsub("//","--"); print $0}' |head -5

SED:

iconv -l | grep ISO |head -5 | sed 's/\//-/g'
# or, to avoid needing to escape the backslashes:
iconv -l | grep ISO |head -5 | sed 's#/#-#g'
    
por 13.09.2013 / 18:27
2

grep é mais ou menos um subconjunto de sed ( grep representa o comando g/re/p em ed e sed é como ed aplicado a [s] treams), portanto você geralmente não precisa canalizá-los juntos.

iconv -l | sed '/ISO/!d;s,//,--,g' | head -n 5
    
por 13.09.2013 / 22:25
2

sed é uma opção:

$ iconv -l | grep ISO | sed 's#/#-#g' | head -5
CSISO4UNITEDKINGDOM--
CSISO10SWEDISH--
CSISO11SWEDISHFORNAMES--
CSISO14JISC6220RO--
CSISO15ITALIAN--
    
por 13.09.2013 / 18:01
1

Ao usar sed , você não precisa usar barras para denotar os argumentos para pesquisar / substituir. Você pode alterá-los para qualquer coisa que você quiser. Por exemplo:

$ iconv -l|grep ISO | sed 's@//@--@g' | head -5
CSISO4UNITEDKINGDOM--
CSISO10SWEDISH--
CSISO11SWEDISHFORNAMES--
CSISO14JISC6220RO--
CSISO15ITALIAN--

Isso pode ser condensado, já que você está procurando o mesmo personagem:

$ iconv -l|grep ISO|sed 's@/@-@g' | head -5
CSISO4UNITEDKINGDOM--
CSISO10SWEDISH--
CSISO11SWEDISHFORNAMES--
CSISO14JISC6220RO--
CSISO15ITALIAN--
    
por 13.09.2013 / 20:00
0

Existem várias maneiras de fazer isso, mas eu uso sed com a opção -n aka --quiet ou --silent para suprimir a saída por padrão.

iconv -l | sed -n -e '/ISO/ s://:--:p'

Esse script sed ignora as linhas que não contêm "ISO", altera // para - e imprime a linha de correspondência (modificada). O 'p' final no script é o que diz ao sed para imprimir a linha correspondente.

Para evitar muitas fugas desagradáveis de barra invertida, usei : como o caractere separador de expressão regular em vez de /

Veja a página de manual do sed para mais detalhes.

    
por 14.09.2013 / 03:03