次のPythonファイルがあります
#!/usr/bin/env python
import sys, argparse
from pbsuite.utils.setupLogging import *
....
私はそれを次のように変更したいと思います:
#!/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 *
残念ながら、sed -i.bak '2 s|^.*$|sys.path.append(${OUTPUT})|g' a.py
変数は上書きされ、その内容に置き換えられませimport sys, argparse
ん。$OUTPUT
#!/usr/bin/env python
sys.path.append(${OUTPUT})
from pbsuite.utils.setupLogging import *
MacとLinuxでこの問題を解決するには?
答え1
$ 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 *
....
奇妙なソリューション
$ 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 *
....
答え2
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
答え3
${OUTPUT}
これは、リテラルを形成するために一重引用符を使用するシェル引用の問題に近いです。
$ export OUTPUT="a test"
$ echo 'bla blah ${OUTPUT} blah'
bla blah ${OUTPUT} blah
$ echo 'blah blah '"${OUTPUT}"' blah'
blah blah a test blah
$
'blah blah '${OUTPUT}' blah'
上記の二重引用符のバージョンとは微妙な違いがありますが、正しく見えるかもしれません。
答え4
あなたの場合、これら2行の間に行を追加する前に変更する必要があります。一重引用符を二重引用符に変換では、sed
シェル変数があり、次のようなものを使用することがわかります。
間のスペースを参照してください。1そしてa\sys.path.append(${OUTPUT})非常に重要です。
sed -i.bak "1 a\sys.path.append(${OUTPUT})" a.py