sed コマンドの正しいデプロイ

sed コマンドの正しいデプロイ

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つの問題があります。

  1. macOSのシェルはsh非常に古いバージョンであり、bashここでコマンドの置き換えで説明されているように不均衡引用符を使用できないバグがあります。

    $ a=$( cat <<'END'
    > "
    > END
    > )
    > sh: unexpected EOF while looking for matching `"'
    

    (最後に押す必要がありますCtrl+D)

    Homebrewパッケージマネージャ(またはそれに対応するもの)から最新のシェルをインストールするか、bashmacOSでシェルを使用してこの問題を解決できます。zsh

  2. macOSsedにはそのようなオプションはありません-rsedmacOSで拡張正規表現を使用するには-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

おすすめ記事