Bash
正確分配 sed 命令
我正在嘗試將 sed 命令的結果分配給 bash 中的變數,但我無法正確地轉義所有內容(可能只是由於我缺乏 bash 知識),我嘗試過:
hash_in_podfile=$( sed -rn 's/^ *pod [\'\"]XXX["\'],.*:commit *=> *["\']([^\'"]*)["\'].*$/\1/p' ${PODS_PODFILE_DIR_PATH}/Podfile )
但我得到
bash_playground.sh:第 9 行:在尋找匹配的 `’’ 時出現意外的 EOF
更新的腳本
這是我正在使用的腳本,使用答案中的程式碼進行了更新。只有路徑和註釋發生了變化:
#!\bin\sh PODS_PODFILE_DIR_PATH='/Users/path/to/file' # just a comment hash_in_podfile=$(sed -rnf - <<\! -- "${PODS_PODFILE_DIR_PATH}/Podfile" s/^ *pod ['"]XXX["'],.*:commit *=> *["']([^'"]*)["'].*$/\1/p ! ) echo $hash_in_podfile
執行與
sh script_name.sh
sh --version
產量:GNU bash,版本 3.2.57(1)-release (x86_64-apple-darwin20) 版權所有 (C) 2007 Free Software Foundation, Inc.
執行時我得到:
script_name.sh: line 6: unexpected EOF while looking for matching `"' script_name.sh: line 10: syntax error: unexpected end of file
您的腳本中有兩個問題:
- macOS 上的
sh
macOS 是一個非常舊的bash
shell 版本,它有一個錯誤會阻止您在命令替換中使用 here-documents 中的不平衡引號:$ a=$( cat <<'END' > " > END > ) > sh: unexpected EOF while looking for matching `"'
(我不得不在最後按
Ctrl+D
。)
)您可以通過
bash
從 Homebrew 包管理器(或同等產品)安裝更新的 shell 或zsh
在 macOS 上使用 shell 來解決此問題。 2. macOS上sed
沒有-r
選項。sed
要在 macOS 上使用擴展正則表達式,請使用-E
(現在 GNU 也支持此功能sed
)。不過,您的表達式不使用擴展的正則表達式功能,因此只需刪除該選項也可以。macOSsed
也不能-
用作選項參數來-f
表示“從標準輸入讀取”。改為使用/dev/stdin
。建議:
#!/bin/zsh PODS_PODFILE_DIR_PATH='/Users/path/to/file' # just a comment hash_in_podfile=$(sed -n -f /dev/stdin -- $PODS_PODFILE_DIR_PATH/Podfile <<'END' s/^ *pod ['"]XXX["'],.*:commit *=> *["']([^'"]*)["'].*$/\1/p END ) echo $hash_in_podfile
如果您只想輸出值,則不要使用中間變數:
#!/bin/zsh PODS_PODFILE_DIR_PATH='/Users/path/to/file' # just a comment sed -n -f /dev/stdin -- $PODS_PODFILE_DIR_PATH/Podfile <<'END' s/^ *pod ['"]XXX["'],.*:commit *=> *["']([^'"]*)["'].*$/\1/p END