Pode trabalhar com regex?

5

Eu tenho um arquivo como este:

AAAA  
BBBB  
CCCC   
DDDD   
etc  

Palavras em linhas separadas. Eu quero adicionar citações usando tr .
Então eu tentei o seguinte:

1) Para adicionar uma cotação no início de cada palavra, por exemplo, 'AAAA

  • tr '^\w$' '\'\w$' <file.txt Não funciona
  • tr '^\w$' ''\w$' <file.txt Não funciona

Ambos os itens acima deixam a linha de comando travada.

2) Para adicionar uma cotação ao final, tentei:

tr '\n' ''\n' <file.txt Mas isso não funciona e a linha de comando fica presa.

Por que esses regex não funcionam com tr ?

    
por Jim 15.08.2013 / 22:56

4 respostas

8

Você não pode substituir várias coisas como esta por tr . Eu usaria sed para fazer isso em vez disso.

Exemplo

$ sed "s/^/'/" file.txt
'AAAA
'BBBB
'CCCC
'DDDD

Diz para encontrar o início de cada linha ( ^ ) e substituí-la por uma única citação ( ' ).

Se você quiser agrupar as "palavras" entre aspas simples, use esta forma de comando:

$ sed "s/\(.*\)/''/" file.txt
'AAAA'
'BBBB'
'CCCC'
'DDDD'

Desta vez, estamos salvando qualquer coisa na linha em uma variável temporária ( ). Em seguida, substituímos a linha por esse '' .

Este comando pode ser abreviado para isso, use switches específicos do GNU:

$ sed -r "s/^(.*)$/'&'/" file.txt
'AAAA'
'BBBB'
'CCCC'
'DDDD'
    
por 15.08.2013 / 23:06
3

tr é para transliteração. Um uso popular de tr é alterar o caso das strings:

$ echo 'this is a test' | tr a-z A-Z
THIS IS A TEST

Alguma versão dos sistemas operacionais de tr , precisa que o a-z tenha o formato [a-z] , caso em que também deve ser citação:

$ echo 'this is a test' | tr '[a-z]' '[A-Z]'
THIS IS A TEST 

Informa que você tem o pacote info instalado em seu sistema, a página tr tem alguns exemplos muito bons e explicações adicionais sobre o comando tr :

info coreutils 'tr invocation'

Para o que você está tentando alcançar, você provavelmente quer usar sed, perl ou awk.

Perl:

perl -pe "s/^/'/" file

para cada linha, corresponde ao início da linha ( ^ ), substitui por '

Sed:

sed "s/^/'/" file

Semelhante ao exemplo de perl

Awk:

awk -v x="'" '{ print x$0 }' foo

Atribua a variável x a ' e para cada linha imprima ' e depois toda a linha

    
por 15.08.2013 / 23:30
2

Não, tr é apenas para substituir caracteres um por um. Você não pode adicionar caracteres dessa maneira.

Você pode usar algo como o perl para fazer isso:

perl -pe "s/\w+/'$&'/"

Com tr , você pode apenas substituir, por exemplo, um tipo de citação por outro tipo:

tr \" \'

Essas barras invertidas são apenas para dizer ao seu shell para enviar o caractere como ele é e não tentar interpretá-lo.

Isso não funcionará:

tr '"' '''
tr '"' '\''

O primeiro argumento ( '"' ) é bom, é exatamente o mesmo que \" . O segundo argumento em ambos os casos não funciona: você não pode citar aspas simples usando aspas simples quando a segunda citação termina a citação e a terceira citação abre uma nova que está faltando. (portanto, seu shell abre uma nova linha para aguardar a cotação final ausente).

Mas tudo isso é apenas um shell e não tem nada a ver com tr .

    
por 15.08.2013 / 23:04
2

A solução mais rápida é geralmente usar o utilitário mais simples de uma tarefa.

tr é um utilitário simples, mas para outra coisa: transliteração (transformando os caracteres dados em outros), removendo os caracteres dados ou apertando caracteres.

Mais utilitários genéricos como sed , awk ou perl (por ordem de tamanho) farão isso, mas aqui você tem um utilitário de uma tarefa que também seria bom: paste :

paste -d\' /dev/null file.txt /dev/null

Ou:

:|paste -d\' - file.txt -
    
por 16.08.2013 / 07:39