我正在尝试为 Git 构建一个 cherry-picking UI。输出git log
产生如下行:
e9dfe65 "Alice, 78 minutes ago - Thumbnails are now 300x300" no
3b780ba "Bob, 3 hours ago - new intro page" no
7ba8120 "Charles, 20 hours ago - add cutoff date for widget timing" no
我想将其作为参数传递给对话请查看清单:
dialog --checklist "Choose commits to cherry-pick:" 0 0 0 ...
不幸的是,我不知道如何将 git-log 的输出作为参数传递给对话框。
dialog 的进一步参数是 3 元组,例如<commit> <message> <selected>
,因此上面有 git-log 的格式。我似乎无法弄清楚扩展。
一些测试:
$ git log ... >temp
$ args="$(cat temp)" ; echo $args[2]
9 // WRONG
$ args=`cat temp` ; echo $args[2]
9 // WRONG
$ args=(`cat temp`) ; echo $args[2]
"Alice, // WRONG
更新:的正确结果$args[2]
应该是Alice, 78 minutes ago - Thumbnails are now 300x300
。
答案1
您可以使用以下代码将行中除第一个和最后一个空格之外的所有空格替换为不间断的空格字符,shell 不会将其视为空格。
awk '{ x=$2; for(i=3;i<NF;i++){x=x " " $i }; print $1 " " x " " $NF }' temp
要删除引号(不幸的是,所有引号),请使用:
awk '{ gsub(/"/, ""); x=$2; for(i=3;i<NF;i++){x=x " " $i }; print $1 " " x " " $NF }' temp
验证其是否有效:
$ awk '…' temp | cut -d" " -f1
e9dfe65
3b780ba
7ba8120
$ awk '…' temp | cut -d" " -f2
Alice, 78 minutes ago - Thumbnails are now 300x300
Bob, 3 hours ago - new intro page
Charles, 20 hours ago - add cutoff date for widget timing
超级用户破坏了我的答案。 中的引号之间的空格字符x=x " " $i
应该是0xC2A0
Unicode 代码点U+00A0
。
答案2
对 IFS 进行一些修改,并删除一些空格,然后您就可以提取参数,但它并不完全是一行。
#!/usr/bin/bash
# log format:
#
# $one $two $three
# nnnnn "mmmm mmm mmm mmm" zzzzzz
# save the current IFS, to restore
OLDIFS=$IFS
# set the new IFS to " marks
IFS='"'
cat /tmp/log | while read one two three; do
# strip the whitespace from $one and $three
one="$(echo $one | sed -e 's/ //g')"
three="$(echo $one | sed -e 's/ //g')"
# print in brackets to see what falls where
echo "[$one]: [$two] [$three]"
done
# reset the IFS
IFS=$OLDIFS
从那里你的线被分开,保持引用的中间场,你可以用它做任何你需要的事情。