提取空白分隔字符串的部分

时间:2017-07-20 09:35:20

标签: git shell sed command-substitution

如果有几个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

起初我尝试使用sed -n 1p / 2p和head / tail -1读取mergedriver.info,但不幸的是$(git cat-file -p HEAD:mergedriver.info)的输出对于运行此脚本的两个不同平台是不同的:< / p>

平台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 个答案:

答案 0 :(得分:1)

由于您使用的是<<<,我猜您正在使用bash,因此您可以使用mapfile将变量拆分为数组,每行一个元素:

$ echo "$mergedriverinfo"
test
conflict-on-auto-merge
$ mapfile -t lines <<<"$mergedriverinfo"
$ echo "${lines[0]}"
test
$ echo "${lines[1]}"
conflict-on-auto-merge

所以你的项目键是元素0,repo slug是元素1。