sedコマンドの結果をbashの変数に割り当てようとしますが、すべてを正しくエスケープすることはできません(おそらくbashの知識が不足しているため)。以下を試しました。
hash_in_podfile=$( sed -rn 's/^ *pod [\'\"]XXX["\'],.*:commit *=> *["\']([^\'"]*)["\'].*$/\1/p' ${PODS_PODFILE_DIR_PATH}/Podfile )
しかし、ますます多くなります。
bash_playground.sh: line 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)-リリース(x86_64-apple-darwin20) Copyright (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
スクリプトには2つの問題があります。
macOSのシェルは
sh
非常に古いバージョンであり、bash
ここでコマンドの置き換えで説明されているように不均衡引用符を使用できないバグがあります。$ a=$( cat <<'END' > " > END > ) > sh: unexpected EOF while looking for matching `"'
(最後に押す必要がありますCtrl+D。
)
)Homebrewパッケージマネージャ(またはそれに対応するもの)から最新のシェルをインストールするか、
bash
macOSでシェルを使用してこの問題を解決できます。zsh
macOS
sed
にはそのようなオプションはありません-r
。sed
macOSで拡張正規表現を使用するには-E
(GNUでもサポートされていますsed
)を使用してください。ただし、式は拡張正規表現機能を使用しないため、そのオプションを削除するだけで機能します。また、macOSは「標準入力から読み取る」を意味するオプション引数sed
としては使用できません。代わりに使用してください。-
-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