文字列のスペースで区切られた部分の抽出

文字列のスペースで区切られた部分の抽出

ファイルを含むGitリポジトリが複数あります。mergedriver.info

ファイルは常に次のようになります。

<project name>
<repository name>

Gitマージドライバによってトリガされたスクリプトはこのファイルを評価します。

mergedriverinfo="$(git cat-file -p HEAD:mergedriver.info)"
success=$?
if [[ "$success" == "0" ]]; then
    log "Evaluating mergedriver.info"

    PROJECT_KEY="$(sed -E 's/([^\s]+)\s+([^\s]+)/\1/' <<< $mergedriverinfo)"
    REPO_SLUG="$(sed -E 's/([^\s]+)\s+([^\s]+)/\2/' <<< $mergedriverinfo)"

    log "PROJECT_KEY=$PROJECT_KEY"
    log "REPO_SLUG=$REPO_SLUG"
else
    log "Unable to read mergedriver.info"
    exit 1
fi

この場合、sedの動作を理解していません。

そのためにmergedriver.info

test
conflict-on-auto-merge

ログ出力は次のとおりです。

2017-07-20 11:05:51.747 PROJECT_KEY=test
2017-07-20 11:05:51.748 REPO_SLUG=tesconflict-on-auto-merge

最初はmergedriver.infoを使用しsed -n 1p/2phead/読み込もうとしましたが、残念ながらtail -1このスクリプトを実行する2つのプラットフォームの出力が異なりました。$(git cat-file -p HEAD:mergedriver.info)

プラットフォーム1:

$ od -c <<< $(git cat-file -p HEAD:mergedriver.info)
0000000   t   e   s   t  \n   c   o   n   f   l   i   c   t   -   o   n
0000020   -   a   u   t   o   -   m   e   r   g   e  \n
0000034

プラットフォーム2:

±  od -c <<< $(git cat-file -p HEAD:mergedriver.info)
0000000   t   e   s   t       c   o   n   f   l   i   c   t   -   o   n
0000020   -   a   u   t   o   -   m   e   r   g   e  \n
0000034

この問題を解決するには?

ベストアンサー1

sed正規表現は、すべきだと[^\s]思う作業をしないことに気づくべきです。空白以外の文字を検索しますが、バックスラッシュ\と文字という2つの文字を無効にしますs

\S特にこの目的に必要なものがあります。

複数行にわたって表示されるManage mergedriver.infoコマンドの出力は、ツールボックスのNコマンドです。sed

PROJECT_KEY=$(sed -nEe '$!N;s/(\S+)\s+(\S+)/\1/p' <<<"$mergedriverinfo")
  REPO_SLUG=$(sed -nEe '$!N;s/(\S+)\s+(\S+)/\2/p' <<<"$mergedriverinfo")

おすすめ記事