Insere texto em linhas específicas de um arquivo? com caracteres especiais

2

Eu sei que isso foi respondido várias vezes, mas não consigo descobrir como usá-lo para meu projeto.

Eu tenho vários arquivos php e quero adicionar uma nova string entre as linhas 11 e 12. esta é a string que eu quero adicionar

exec('/var/www/scripte/autostandby.sh > /dev/null 2>/dev/null &');

Eu acho que este é o caminho a percorrer (para um único arquivo, para vários eu vou usar * .php em vez de arquivo):

sed '12i\
exec('/var/www/scripte/autostandby.sh > /dev/null 2>/dev/null &');
' file.php

o que eu recebo:

[1] 29234                                                                                                            
bash: $');\n': command not found  

então eu acho que o bash apenas executa o comando exec ou algo assim.

como faço para adicionar uma string "longa" contendo espaços e coisas do tipo; ), 'o que parece atrapalhar o comando?

p.s .: adicionando "" ou "" não engana o pônei.

Bônus:

Eu também preciso "anexar" algo na linha 11 a partir disso:

exec('/var/www/streams/taketv.sh'); 

para isso

exec('/var/www/streams/taketv.sh > /dev/null 2>/dev/null &'); 

Se possível, para todos os arquivos .php. É sempre a linha 11; a única coisa que muda é "taketv.sh" para "abc.sh" ou qualquer coisa assim.

É a primeira ocasião em que "');" são mostrados nessa combinação, então tentei com algo parecido com isto (somente para um arquivo como teste):

 sed -i "s/');/ > /dev/null 2>/dev/null &');" TakeTV.php

Eu acho que preciso usar o que mikeserv disse. Eu tentei, mas não funcionou.

sed -i 's\                                                                             
'\'');/'\''/'\'' > /dev/null 2>/dev/null &');'\''    

Meu plano era definir a "palavra antiga" e a "nova palavra" como uma frase fechada, acho que não a apliquei corretamente!

    
por SchnitzelKopf 25.11.2015 / 10:49

2 respostas

1

Você tem que usar vários tipos de citações ou escapar delas:

sed -i "12iexec('/var/www/scripte/autostandby.sh > /dev/null 2>/dev/null &');" *.php      

Bônus:

 sed -i "s|exec('/var/www/streams/taketv.sh');|exec('/var/www/streams/taketv.sh > /dev/null 2>/dev/null \&');|" 
    
por 25.11.2015 / 11:07
0
sed '12i\
exec('\''/var/www/scripte/autostandby.sh > /dev/null 2>/dev/null &'\'');
' file.php

Você tem que citar a coisa toda.

Seu problema é que você está tentando inserir citações de uma string entre aspas. É factível, mas você tem que citar as citações.

command 'begin quoted arg'\''
   close quotes
   backslash quote the apostrophe
   open quotes again
'\'' end quoted arg'

Você pode fazer isso sem tudo:

sed -e'11s|.)[^)]*$| >/dev/null 2>/dev/null&|p' \
    -e'11s|www.*sh|www/scripte/autostandby.sh|' <in >out

Ainda se você usar a ppend ou i nsert ou c hange, é realmente melhor fazê-lo como você tentou fazer na sua pergunta. Esses comandos são especificados para exigir um separador de nova linha entre os comandos e os argumentos de texto que eles pegam.

    
por 25.11.2015 / 11:00