7

У меня есть команда Git SVN, как это:

git svn log --limit=1 --oneline

Он выведет oneline следующим образом:

r12345 | <anything, as it is svn comment inputted by svn-user>

Я пытаюсь передать команду sed, чтобы получить только 12345 , но не могу заставить его работать. Есть много ошибок, а текущая - parenthesis not balanced

моя последняя команда была следующей:

git svn log --limit=1 --oneline | sed -e 's/r\(0-9) |*/\1/'

Я погуглил, и документация по sed не совсем понятна ... Я не очень хорош в регулярных выражениях, и мой лучший опыт - в git --grep который является упрощенным регулярным выражением с хорошей документацией.

Окружающая среда MacOSX терминал, если имеет значение.

РЕДАКТИРОВАТЬ:

sed -n 's/r\(0-9*\)/\1/ работает, но возвращает пустую строку.

4 ответа4

14

Вот решение без регулярных выражений, потому что

Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них две проблемы.

(возьми это с зерном соли)

Вы можете использовать cut дважды:

git svn log --limit=1 --oneline | cut -d ' ' -f 1 | cut -c 2-

Первый разрез (cut -d ' ' -f 1) устанавливает пробел в качестве разделителя столбцов и выбирает только первый столбец, поэтому r12345 . Второй разрез (cut -c 2-) выбирает символ в позиции 2 и после (2-).

7

Ты почти там

sed -e 's/r\([0-9]*\) .*/\1/'

Вы должны указать sed и то, что вы хотите \([0-9]*\) и то, что вы не хотите /r & .*/

3

Я чувствую, что sed даже не лучший инструмент, поскольку он предназначен для изменения строки, но я рассматриваю это больше как проблему извлечения. Для которого регулярное выражение с группами является очень разумным путем. По какой-то причине у grep нет способа извлечь группы, что я нахожу странным. К счастью, pcregrep делает.

pcregrep -o1 "^r([0-9]+)"

Будет соответствовать шаблону "r", за которым следуют некоторые цифры, только в начале строки (это то, что делает ^ - иначе вы могли бы извлечь несколько совпадений, если сообщение фиксации ссылается на другой коммит). -o1 - извлечь первую группу. Пример:

$ echo "r12345 | <anything>" | pcregrep -o1 "^r([0-9]+)"
12345

Зачем использовать это вместо sed? Чисто для простоты. Вам нужно только извлечь что-то, так что можете использовать чистое регулярное выражение. Я считаю это намного проще, чем ответ sed .

-1
An other alternative may be:

$ echo "r12345 | " | sed -n 's/^r\([0-9]*\) .*$/\1/p'
12345
$_

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