Bash

正確分配 sed 命令

  • August 27, 2021

我正在嘗試將 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

您的腳本中有兩個問題:

  1. macOS 上的shmacOS 是一個非常舊的bashshell 版本,它有一個錯誤會阻止您在命令替換中使用 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

引用自:https://unix.stackexchange.com/questions/666497