2017-04-09 130 views
1

我一直在使用Google搜索一段時間,但無法找到答案。我有以下bash函數,它在Python項目目錄中爲'NAME'執行grep。它拾取包含'NAME'的正確文件。然後我運行sed命令以用用戶輸入字符串替代'NAME'python腳本的sed替換 - 「命令未找到」問題

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 
} 

我得到的錯誤是:

/Users/me/scripts/new_python_project.sh: line 37: try:: command not found 
from: can't read /var/mail/nose.tools 

現在,匹配其中2個文件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 

戰略經濟對話似乎做了更換,但隨後因爲它試圖執行輸入文件的出現?任何想法發生了什麼?

回答

1

嘗試採取了回來蜱和使用SED的/姓名/ $ 1/G'「$文件」

背面蜱看到一個間接,因此它正試圖在SED命令後執行$文件反對與sed一起使用它。

+0

我試過'\'sed's/NAME /'$ 1'/ g'「$ file」'''但仍然是同樣的問題。我也嘗試過'$(sed's/NAME /'$ 1'/ g''$ file「)',但結果相同。還有其他建議嗎? – njk2015

+0

我的不好。我刪除了'\'... \''滴答聲,它工作。你能解釋一下爲什麼這有效嗎?什麼是間接的?爲了在bash腳本中執行一個命令,我認爲你必須使用'\'... \''ticks或$(...)'? – njk2015

+1

@ njk2015反引號或'$(...)'語法用於當您想要將命令的輸出捕獲爲字符串時,例如,您可以將它保存在Bash變量中。順便說一句,'$(...)'比反引號要好:反引號使得代碼不易讀,並且不支持命令的嵌套。 –