alterando o padrão de um arquivo de texto

3

Um arquivo de texto tem um conteúdo parecido com

chair
table
pen
desk

Agora eu quero que ele seja alterado e armazenado em uma variável, digamos var como abaixo

('presidente', 'presidente'), ('mesa', 'mesa'), ('caneta', 'caneta'), ('mesa', 'mesa')

é possível?

EDITAR O anser de Jofel deu o seguinte erro

$ sed ':a;N;$!ba;s/\n/,/g;s/\w*/(''&'',''&'')/g' -i csclm.txt
sed: The label :a;N;$!ba;s/\n/,/g;s/\w*/(&,&)/g is greater than eight characters.

Estou usando:

$ uname -a
HP-UX rcihp145 B.11.23 U 9000/800 3683851961 unlimited-user license
    
por munish 23.02.2012 / 09:28

5 respostas

3

Uma maneira de usar sed :

Conteúdo de script.sed :

## Change line.
s/.*/('&','&')/

## Append it to hold space.
H

## In end of file substitute newlines with commas and print.
$ {
    g   
    s/^\n//
    s/\n/,/g
    p   
}

Comando:

sed -nf script.sed infile

Saída:

('chair','chair'),('table','table'),('pen','pen'),('desk','desk')
    
por 23.02.2012 / 12:14
2

Não há necessidade de um subprocesso, isso pode ser feito no shell bash puro:

var=$(while read line; do echo -n ",('$line','$line')"; done < file)
var=${var:1}

Atualizar :

Se você quiser isso como um one-liner, você pode:

var=$({ read line && echo -n "('$line','$line')" && while read line; do echo -n ",('$line','$line')"; done } < file)

Observe o && para executar echo e while apenas o arquivo não está vazio.

    
por 23.02.2012 / 13:17
2

Aqui está um método de shell puro: leia todas as linhas e anexe os dados adequadamente massificados a var . Retire a vírgula extra.

var=
while IFS= read -r line; do
  var="$var,('$line','$line')"
done <input_file
var=${var#,}

Aqui está um método simples usando utilitários externos: massageie cada linha com sed e, em seguida, transforme as novas linhas em vírgulas. Retire a vírgula extra.

var=$(<input_file sed "s/.*/('','')/" | tr "\n" ',')
var=${var%,}
    
por 27.02.2012 / 02:56
1

Aqui, uma solução não com awk , mas com sed :

Para fazer a substituição no FILENAME, execute

sed ':a;N;$!ba;s/\n/,/g;s/\w*/(''&'',''&'')/g' -i FILENAME

Para mais informações, consulte esta questão .

    
por 23.02.2012 / 10:31
1

Uma maneira muito complicada de fazer isso, trabalhando apenas no shell bash (por causa da substituição do processo), mas usando apenas comandos simples:

var=$(sed -e "s/^/'/" -e "s/\$/'/" file |
  paste -d "," - <(sed -e "s/^/'/" -e "s/\$/'/" file) |
  sed -e "s/^/(/" -e "s/\$/)/" |
  paste -s -d ",")
    
por 23.02.2012 / 13:31