在两行之间插入文本

在两行之间插入文本

我有以下 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 变量并使用这样的东西,

注意之间的空格1a\sys.path.append(${OUTPUT})很重要。

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

相关内容