слово перед последним словом строки - PullRequest
1 голос
/ 02 марта 2012

Я хочу добавить имя каталога до последнего слова в строке.Строка имеет следующий формат:

100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^IoneFile$

, где ^I обозначает tab, а $ обозначает конец строки.Эта строка генерируется git ls-files -s.

Я хочу, чтобы команда sed добавляла one/ к имени файла в этой строке, например:

`100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^Ione/oneFile$

Некоторые строки, которые я 'мы попробовали, и их соответствующие выходные данные:

  1. Соответствует самой длинной строке символов, которые не \t, сопровождаемые $;append one/:

    $ git ls-files -s | sed 's|[^\t]*$|one/&|'  
    one/100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0   oneFile
    
  2. Соответствует самой длинной строке символов, которые не являются \t или ' ', за которыми следует $;pre-pend one/:

    $ git ls-files -s | sed 's|[^\t ]*$|one/&|'
    100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e one/0   oneFile
    
  3. Соответствует самой длинной строке символов, которые не являются горизонтальными пробелами, с префиксом «один /»:

    $ git ls-files -s | sed 's|[^[[:blank:]]]*$|one/&|'
    100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0   oneFilone/e
    

Я в основном перепробовал множество вещей, подходящих для:

  • [^\t ]*$|one/&
  • [^[[:space:]]]*$|one/&

иперечисленные выше.Самое близкое, что я могу получить, это иметь oneFilone/e, который был [^[[:blank:]]]*$|one/&|', или предварительно ожидать 0, но я не могу, кажется, получить то, что хочу.

РЕДАКТИРОВАТЬ Поскольку несколько человек комментировали / публиковали ответы, ни один из которых не работал для меня, я решил добавить: я использую Mac OS X 10.7.3.Версия sed Я не совсем уверен (если кто-нибудь знает способ получить комментарий, добавьте комментарий к этому эффекту) - страница man sed говорит, что это BSD sed.Я не уверен, насколько это отличается от GNU sed, если таковые имеются.

Я также использую zsh, с запущенным oh-my-zsh (довольно немодифицированным).Я включил extended_glob (setopt extended_glob).

Я прокомментировал свои результаты для ответов, которые дали люди;Я предполагаю, что они работают в дистрибутиве Linux?Сегодня вечером у меня нет доступа к системе не-OS X, но завтра я перезапущу все ответы;может быть, это просто мой [shell|OS|bad karma], который не позволяет им работать на меня.

РЕДАКТИРОВАТЬ Снова:

Итак, я протестировал систему Ubuntu, и (1) выше работает.Я хотел бы рабочую версию для моего Mac, хотя.

Окончательное редактирование: Спасибо всем, кто ответил рабочими эквивалентными командами.Оказывается, мой первый работает , но не с BSD sed.У меня, однако, есть gsed (спасибо, что указал на это!), Что делает все это волшебным образом.

Ответы [ 5 ]

2 голосов
/ 02 марта 2012

Это может сработать для вас (или я что-то упустил?):

echo -e "100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0\toneFile" | sed 's/\t/&one\//'
100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0       one/oneFile
1 голос
/ 02 марта 2012

Это проще, но, кажется, работает:

echo -e '100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0 oneFile' | sed -e 's/\([a-zA-Z]\+\)$/one\/\0/g'
100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0 one/oneFile

Он также должен работать с вкладкой непосредственно перед oneFile.

1 голос
/ 02 марта 2012

не в состоянии проверить прямо сейчас, но вы используете слишком много скобок с классами символов.

[^[[:space:]]]*$|one/&

должно быть

[^[:space:]]*$|one/&

С дополнительными скобками вы получите только символы '[', ':', 's', 'p', 'a','c', 'e', ​​']' - объяснение, почему dir вставляется перед последним 'e'

1 голос
/ 02 марта 2012

Для меня работает следующее:

git ls-files -s | sed -e 's|\t\(.\+\)$|\tone/\1|g'

100644 345242cb0c4e9bb01a6fef9947f4342ff2f68553 0       one/ExView/resource.h

было бы

100644 345242cb0c4e9bb01a6fef9947f4342ff2f68553 0       ExView/resource.h

У меня также были проблемы, когда у меня возникали странные проблемы с новой линией.Я сомневаюсь, что это ваша проблема, но в прошлом git ls-files -s | tr -d '\r' | ... был полезным для меня.

0 голосов
/ 07 января 2015

Я хотел сделать именно это, но не разбирался ...

Единственная проблема в том, что OS X sed не распознает \ t как символ TAB, как объяснено здесь .Вы должны использовать фактический символ табуляции.Используйте вариант 1 в исходном сообщении, но вместо ввода \t нажмите Ctrl+v, а затем клавишу Tab.Это трудно скопировать и вставить здесь, поэтому вам придется сделать это самостоятельно.: -)

См. Также этот вопрос .

...