2014-03-31 50 views
2

我最近升級了我的FreeBSD盒子,現在pythonbrew似乎被打破了。它撈出.pythonbrew的/ etc/bashrc中在這條線的文件:pythonbrew bashrc awk行不再工作

PATH_WITHOUT_PYTHONBREW=$(printf "$PATH" | awk -v RS=: -v ORS=: "/${PATH_ROOT//\//\/}/ {next} {print}" | sed -e 's#:$##') 

給出了錯誤:

awk: syntax error at source line 1 
    context is 
     >>> //home/myusername/. <<< pythonbrew/ {next} {print} 
awk: bailing out at source line 1 

這PATH_ROOT變量是

/home/myusername/.pythonbrew 
+1

在我看來,你嘗試在'awk'代碼中讀取變量。 awk -v RS =:-v ORS =:-v path = $ path_root'$ 0 ==路徑{next ...' – Jotne

+0

'$ {PATH_ROOT // \ // // \\\/「工作?儘管@Jotne表示使用'-v'可能是一個更好的計劃。雖然用'$ 0〜path',如果你想要正則表達式匹配而不是相等。 –

回答

4
  1. 不要把變量放在你的printf格式化參數中,因爲當你的變量包含printf格式化字符時會失敗,例如'%'。所以用printf "%s" "$PATH"而不是printf "$PATH"
  2. 使用雙引號分隔awk腳本永遠不是一個好主意,因爲它會在腳本的其餘部分引入雙引號。因此,使用'/'"${PATH_ROOT//\//\/}"'/{...}'而不是"/${PATH_ROOT//\//\/}/{...}"
  3. 允許shell變量擴展動態地提供awk腳本的部分內容幾乎不是一個好主意,因爲它引入了奇怪語法錯誤的可能性。所以用awk -v path_root="${PATH_ROOT//\//\/}" '$0 ~ path_root{...}'代替'/'"${PATH_ROOT//\//\/}"'/{...}'
  4. 而不是測試條件,然後使用next,然後在條件不存在的情況下使用打印,您可以只測試條件的否定。
  5. 將2個變量設置爲相同的值(例如RS和ORS)時,將它們設置在一起而不是單獨設置最爲明顯。

因此,所有一起,作爲一個起點,你的腳本是:

PATH_WITHOUT_PYTHONBREW=$(printf "%s" "$PATH" | 
    awk -v path_root="${PATH_ROOT//\//\/}" 'BEGIN{RS=ORS=":"} $0 !~ path_root' | 
    sed -e 's#:$##') 

假設你PATH_ROOT操作是有意義的。

它可以進一步改善,但應該足以擺脫你的錯誤。

+1

太棒了,謝謝!在$ 0前面有一個額外的單引號,我不能刪除它,因爲它希望編輯至少有6個字符,但是一旦刪除它就會很好。我將看到有關將此添加爲pythonbrew的補丁。 – CaptainThrowup

+0

不客氣,我更新了我的腳本以刪除單引號。如果您想用一些「PATH」可以包含的樣本更新您的問題,並且您希望將「PATH_WITHOUT_PYTHONBREW」設置爲給定這些PATH設置,我相信我們可以向您展示如何輕鬆完成在一個awk命令中,而不是調用多個命令和管道。 –