1

Я пытаюсь создать вишневый интерфейс для Git. Вывод 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 в качестве аргументов в диалог.

Другими аргументами диалога являются 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 .

2 ответа2

2

Вы можете использовать следующий код, чтобы заменить все пробелы в строке, кроме первого и последнего, символом неразрывного пробела, который оболочка не считает пробелом.

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 .

1

небольшое изменение в 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

Оттуда ваша строка разделяется, поддерживая указанное среднее поле, и вы можете делать с ним все, что вам нужно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .