我有以下 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 *
....
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 *
....
答案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
这更多的是一个 shell 引用问题;您使用的单引号构成${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
根据您的情况,如果您想在这两行之间添加一行,那么首先您需要更改单引号转双引号,然后sed
才会明白你有 shell 变量并使用这样的东西,
注意之间的空格1和a\sys.path.append(${OUTPUT})很重要。
sed -i.bak "1 a\sys.path.append(${OUTPUT})" a.py