Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python脚本上的sed替换-“;“未找到命令”;问题_Python_Bash_Sed - Fatal编程技术网

python脚本上的sed替换-“;“未找到命令”;问题

python脚本上的sed替换-“;“未找到命令”;问题,python,bash,sed,Python,Bash,Sed,我已经在谷歌上搜索了一段时间,但找不到答案。我有下面的bash函数,它在python项目目录中为'NAME'执行grep。它将拾取包含'NAME'的正确文件。然后运行sed命令,用用户输入字符串替换'NAME' replace_NAME_in_files() { read -ra MATCHED_FILES <<< `grep 'NAME' $NEW_PROJECT -lR` for file in "${MATCHED_FILES[@]}"; do

我已经在谷歌上搜索了一段时间,但找不到答案。我有下面的bash函数,它在python项目目录中为
'NAME'
执行
grep
。它将拾取包含
'NAME'
的正确文件。然后运行
sed
命令,用用户输入字符串替换
'NAME'

replace_NAME_in_files() {
    read -ra MATCHED_FILES <<< `grep 'NAME' $NEW_PROJECT -lR`
    for file in "${MATCHED_FILES[@]}"; do
        `sed "s/NAME/$1/g" $file`
    done
}
现在,与
grep'NAME'
匹配的两个文件如下所示:

Dev-MacBook-Pro:projects dev$ cat ex47/setup.py 
try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

config = {
        'description': 'My Project',
        'author': 'Dev',
        'url': 'URL to get it at.',
        'download_url': 'Where to download it.',
        'author_email': 'My email.',
        'version': '0.1',
        'install_requires': ['nose'],
        'packages': ['NAME'],
        'scripts': [],
        'name': 'projectname'
}

setup(**config)
sed的另一个输入文件是:

Dev-MacBook-Pro:projects dev$ cat ex47/tests/ex47_tests.py 
from nose.tools import *
import NAME

def setup():
    print "SETUP!"

def teardown():
    print "TEAR DOWN!"

def test_basic():
    print "I RAN!"
使用调试模式运行脚本时,输出为:

++ grep NAME /Users/dev/python/workspace/projects/ex47 -lR
+ for file in '"${MATCHED_FILES[@]}"'
++ sed s/NAME/ex47/g /Users/dev/python/workspace/projects/ex47/setup.py
+ try: from setuptools import setup except ImportError: from distutils.core import setup config = '{' ''\''description'\'':' ''\''My' 'Project'\'',' ''\''author'\'':' ''\''dev'\'',' ''\''url'\'':' ''\''URL' to get it 'at.'\'',' ''\''download_url'\'':' ''\''Where' to download 'it.'\'',' ''\''author_email'\'':' ''\''My' 'email.'\'',' ''\''version'\'':' ''\''0.1'\'',' ''\''install_requires'\'':' '['\''nose'\''],' ''\''packages'\'':' '['\''ex47'\''],' ''\''scripts'\'':' '[],' ''\''name'\'':' ''\''projectname'\''' '}' 'setup(**config)'
/Users/dev/scripts/new_python_project.sh: line 37: try:: command not found
+ for file in '"${MATCHED_FILES[@]}"'
++ sed s/NAME/ex47/g /Users/dev/python/workspace/projects/ex47/tests/ex47_tests.py
+ from nose.tools import ex47 skeleton skeleton_bck import ex47 def 'setup():' print '"SETUP!"' def 'teardown():' print '"TEAR' 'DOWN!"' def 'test_basic():' print '"I' 'RAN!"'
from: can't read /var/mail/nose.tools

sed似乎在执行替换,但它似乎正在尝试执行输入文件?知道发生了什么吗?

试着去掉背面的记号,然后使用sed's/NAME/$1/g'$file“


back ticks看到一个间接寻址,因此它试图在sed命令之后执行$file,而不是将它与sed一起使用。

我尝试了
`sed's/NAME/'$1'/g'$file`
,但仍然存在相同的问题。我还尝试了
$(sed's/NAME/'$1'/g'$file)
,但结果相同。还有其他建议吗?我的错。我删除了
`…`
记号,它就可以工作了。你能再解释一下为什么会这样吗?什么是间接?我认为您必须使用
`…`
ticks或
$(…)
才能在bash脚本中执行命令?@njk2015 backticks或
$(…)
语法用于将命令的输出捕获为字符串,例如可以将其保存在bash变量中。顺便说一句,
$(…)
比backticks好:backticks会降低代码的可读性,并且不支持命令嵌套。这很完美。我接受了答案。谢谢你的帮助!
++ grep NAME /Users/dev/python/workspace/projects/ex47 -lR
+ for file in '"${MATCHED_FILES[@]}"'
++ sed s/NAME/ex47/g /Users/dev/python/workspace/projects/ex47/setup.py
+ try: from setuptools import setup except ImportError: from distutils.core import setup config = '{' ''\''description'\'':' ''\''My' 'Project'\'',' ''\''author'\'':' ''\''dev'\'',' ''\''url'\'':' ''\''URL' to get it 'at.'\'',' ''\''download_url'\'':' ''\''Where' to download 'it.'\'',' ''\''author_email'\'':' ''\''My' 'email.'\'',' ''\''version'\'':' ''\''0.1'\'',' ''\''install_requires'\'':' '['\''nose'\''],' ''\''packages'\'':' '['\''ex47'\''],' ''\''scripts'\'':' '[],' ''\''name'\'':' ''\''projectname'\''' '}' 'setup(**config)'
/Users/dev/scripts/new_python_project.sh: line 37: try:: command not found
+ for file in '"${MATCHED_FILES[@]}"'
++ sed s/NAME/ex47/g /Users/dev/python/workspace/projects/ex47/tests/ex47_tests.py
+ from nose.tools import ex47 skeleton skeleton_bck import ex47 def 'setup():' print '"SETUP!"' def 'teardown():' print '"TEAR' 'DOWN!"' def 'test_basic():' print '"I' 'RAN!"'
from: can't read /var/mail/nose.tools