echo line com var que contém poucas linhas

0

Eu tenho um arquivo chamado 'file1.txt' que contém, por exemplo:

bibi.toto
jaja.bubu
vrtegbvtr.rvgtbtdtbvtd

E eu quero repetir algum texto com o conteúdo var (que contém as linhas file1.txt) assim:

var=$(cat file1.txt)
echo 'hello there is $var' > final.sh

Para finalizar:

final.sh content:

hello there is bibi.toto
hello there is jaja.bubu
hello there is vrtegbvtr.rvgtbtdtbvtd

O script deve usar applets do busybox (awk, grep, sed, cat, ...).

------------------------------------------

Eu tentei primeiro com o comando echo mas recebo: Olá, há $ var mesmo se eu usar aspas duplas (") nem {} e não posso usar aspas duplas para fazer o eco do conteúdo do arquivo porque meu texto tem alguns" e "símbolos.

Eu também tentei com sed assim:

var=$(cat file1.txt)

final.sh content:
hello there is pattern

sed "s/pattern/$var/g" final.sh

Mas eu recebo: sed: inigualável '/' se eu usar:     sed "s / padrão / \ $ var / g" final.sh Eu recebo: Olá, há $ var.

    
por Rom 24.10.2018 / 07:57

5 respostas

2

Tente:

sed 's/^/hello there is /' file1.txt > final.sh

Ou se você tiver que usar uma variável:

printf '%s\n' "$var" | sed 's/^/hello there is /' > final.sh

Se você não se importa em perder linhas vazias, também pode fazer:

IFS='
' # split on newline
set -o noglob # disable glob
printf 'hello there is %s\n' $var > final.sh # invoke split+glob

Para o seu problema real:

sed "s/.*/UPDATE ownership SET library_id = 'u-wl' where doc_id = '&';/" < file1.txt |
  sqlite "$PLAY_DB_DIR/library.db"

(observe que as entradas nos arquivos não contêm ' ou outras seqüências especiais de bytes na linguagem sqlite. Se você não conseguir essa garantia, isso seria uma vulnerabilidade de injeção de sqlite na melhor das hipóteses).

Ou se você precisar gerar código shell para ser executado posteriormente:

{
  echo 'sqlite "$PLAY_DB_DIR/library.db" << "EOF"'
  sed "s/.*/UPDATE ownership SET library_id = 'u-wl' where doc_id = '&';/" < file1.txt
  echo EOF
} > final.sh

Que na sua amostra dá:

sqlite "$PLAY_DB_DIR/library.db" << "EOF"
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'bibi.toto';
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'jaja.bubu';
UPDATE ownership SET library_id = 'u-wl' where doc_id = 'vrtegbvtr.rvgtbtdtbvtd';
EOF

Ou se você tiver para executar um comando sqlite por consulta:

repl=$(cat << "EOF"
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''&'\'';'
EOF
)
sed "s@.*@$repl@" < file1.txt > final.sh

(desta vez, além de uma vulnerabilidade de injeção de sqlite, que se torna uma vulnerabilidade de execução de comando arbitrária, se o arquivo puder conter caracteres de aspas simples).

Na sua amostra, isso dá:

sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''bibi.toto'\'';'
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''jaja.bubu'\'';'
sqlite "$PLAY_DB_DIR/library.db" 'UPDATE ownership SET library_id = '\''u-wl'\'' where doc_id = '\''vrtegbvtr.rvgtbtdtbvtd'\'';'
    
por 24.10.2018 / 08:18
1

Que tal

$ readarray -t X <file
$ IFS=$'\n'
$ echo "${X[*]/#/hello there is }"
hello there is bibi.toto
hello there is jaja.bubu
hello there is vrtegbvtr.rvgtbtdtbvtd
    
por 24.10.2018 / 10:00
0

ex1:

para i em $ (cat file.txt); Faz; echo "olá, há $ i"; feito

Olá, há bibi.toto

Olá, jaja.bubu

Olá, existe vrtegbvtr.rvgtbtdtbvtd.

aqui está um exemplo com loop para!

ex2:

enquanto lê linha; echo "olá, há $ linha"; feito < arquivo.txt

Olá, há bibi.toto

Olá, jaja.bubu

Olá, existe vrtegbvtr.rvgtbtdtbvtd

para obter cada linha do arquivo file.txt

    
por 24.10.2018 / 16:22
0

while read -r var; do echo hello this is $var; done < file1.txt > final.sh deve fazer o que quiser. Isso pressupõe o shell ash , que, acredito, é o que está no busybox. Isso usa o read incorporado para ler o arquivo uma linha por vez em var .

Uma implementação bash equivalente seria semelhante a

while read -r; do echo hello this is ${REPLY}; done < file1.txt > final.sh

que utiliza bash read incorporado.

    
por 25.10.2018 / 02:02
0

Obrigado a todos por terem me ajudado, especialmente @ Stéphane Chazelas e @noob. Minha pergunta pode ser fechada, o comando do Stéphane basicamente funciona, mas o shell no qual o script deve ser usado é bem estranho (problema com o EOF) ..

Como o primeiro comando exemplo de noob é um pouco simples, funciona. Eu usei meus vars assim:

for i in $(cat $file1); do echo "text blabla $i blabla" >> $file2; done

Obrigado mais uma vez a todos.

    
por 25.10.2018 / 08:33