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

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

我有几个包含文件的 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/2phead/读取 mergedriver.info ,但不幸的是,对于运行此脚本的两个不同平台,tail -1的输出是不同的:$(git cat-file -p HEAD:mergedriver.info)

平台一:

$ 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]不会做您认为应该做的事情,即。寻找非空格,而是否定两个字符,反斜杠\和字母s

所需要的是\S专门为此目的的。

管理 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")

相关内容