다음 파이썬 파일이 있습니다
#!/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
귀하의 경우 이 두 줄 사이에 줄을 추가하려면 먼저 변경해야 합니다.작은따옴표를 큰따옴표로 변환, 그러면 sed
쉘 변수가 있고 다음과 같은 것을 사용한다는 것을 이해하게 될 것입니다.
사이의 공백을 참고하세요.1그리고a\sys.path.append(${OUTPUT})매우 중요.
sed -i.bak "1 a\sys.path.append(${OUTPUT})" a.py