inserindo texto entre duas linhas

0

Eu tenho o seguinte arquivo python

#!/usr/bin/env python
import sys, argparse
from pbsuite.utils.setupLogging import *
....

e gostaria de alterá-lo para:

#!/usr/bin/env python
sys.path.append('/anaconda/conda-bld/pbsuite_1490823990330/_t_env/opt/pbsuite-15.8.24')
import sys, argparse
from pbsuite.utils.setupLogging import *

De forma não-rentável, sed -i.bak '2 s|^.*$|sys.path.append(${OUTPUT})|g' a.py sobrescreve import sys, argparse e não substitui a variável $OUTPUT por seu conteúdo

#!/usr/bin/env python
sys.path.append(${OUTPUT})
from pbsuite.utils.setupLogging import *

Como é possível consertá-lo para Mac e Linux?

    
por user977828 30.03.2017 / 03:24

4 respostas

2

$ sed "2i\sys.path.append(\'/anaconda/conda-bld/pbsuite_1490823990330/_t_env/opt/pbsuite-15.8.24\')" file.py
#!/usr/bin/env python
sys.path.append('/anaconda/conda-bld/pbsuite_1490823990330/_t_env/opt/pbsuite-15.8.24')
import sys, argparse
from pbsuite.utils.setupLogging import *
....

solução awk

$ a="sys.path.append('/anaconda/conda-bld/pbsuite_1490823990330/_t_env/opt/pbsuite-15.8.24')"

$ echo $a
sys.path.append('/anaconda/conda-bld/pbsuite_1490823990330/_t_env/opt/pbsuite-15.8.24')

$ awk -v ins="${a}" 'NR==2{printf("%s\n",ins)}1' a.txt
#!/usr/bin/env python
sys.path.append('/anaconda/conda-bld/pbsuite_1490823990330/_t_env/opt/pbsuite-15.8.24')
import sys, argparse
from pbsuite.utils.setupLogging import *
....
    
por 30.03.2017 / 03:33
1
sed -i.bak -e "1G;s|\n|&sys.path.append('/anaconda/conda-bld/pbsuite_1490823990330/_t_env/opt/pbsuite-15.8.24')|" yourpyfile

ed -s yourpyfile <<\cmd
1a
sys.path.append('/anaconda/conda-bld/pbsuite_1490823990330/_t_env/opt/pbsuite-15.8.24')
.
wq
cmd
    
por 30.03.2017 / 08:42
0

Isso é mais um problema de citação de shell; as aspas simples que você usa tornam o ${OUTPUT} literal:

$ export OUTPUT="a test"
$ echo 'bla blah ${OUTPUT} blah'
bla blah ${OUTPUT} blah
$ echo 'blah blah '"${OUTPUT}"' blah'                   
blah blah a test blah
$ 

Observe que 'blah blah '${OUTPUT}' blah' pode parecer correto, embora tenha diferenças sutis da versão acima com as aspas duplas.

    
por 30.03.2017 / 03:36
0

de acordo com sua condição, se você quiser adicionar uma linha entre essas duas linhas, primeiro precisará alterar aspas simples para aspas duplas , e somente sed entenderá que você tem a variável shell e usar algo assim,

Note que o espaço entre 1 e a \ sys.path.append ($ {OUTPUT}) é importante.

sed -i.bak "1 a\sys.path.append(${OUTPUT})" a.py

espero que ajude.

    
por 30.03.2017 / 07:42