我想将目录名预先挂起到一行中的最后一个单词。该行具有以下格式:
100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^IoneFile$
其中^I
表示tab
,$
表示行尾。此行由git ls-files -s
生成。
我想要一个sed
命令将one/
添加到此行的文件名中,如下所示:
`100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^Ione/oneFile$
我尝试过的一些行及其相应的输出:
匹配非\t
后跟$
的最长字符串;追加one/
:
$ git ls-files -s | sed 's|[^\t]*$|one/&|'
one/100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0 oneFile
匹配非\t
或' '
后跟$
的最长字符串; pre-pend one/
:
$ git ls-files -s | sed 's|[^\t ]*$|one/&|'
100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e one/0 oneFile
匹配非水平空格的最长字符串,前置'一个/':
$ git ls-files -s | sed 's|[^[[:blank:]]]*$|one/&|'
100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0 oneFilone/e
我基本上尝试了很多匹配的东西:
[^\t ]*$|one/&
[^[[:space:]]]*$|one/&
以及上面列出的那些。我能得到的最接近的是oneFilone/e
,[^[[:blank:]]]*$|one/&|'
,或预先挂到0
,但我似乎无法得到我想要的东西。
EDIT
因为有几个人评论/发布了答案,但没有一个对我有用,我想我会补充说:我使用的是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
可用(感谢指出这一点!)这使得这些都神奇地起作用。
答案 0 :(得分:2)
这可能对你有用(或者我错过了什么?):
echo -e "100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0\toneFile" | sed 's/\t/&one\//'
100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0 one/oneFile
答案 1 :(得分:1)
以下适用于我:
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' | ...
对我有帮助。
答案 2 :(得分:1)
这更简单,但似乎有效:
echo -e '100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0 oneFile' | sed -e 's/\([a-zA-Z]\+\)$/one\/\0/g'
100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0 one/oneFile
它也应该在oneFile之前使用一个标签。
答案 3 :(得分:1)
现在无法测试,但你在字符类中使用了太多括号。
[^[[:space:]]]*$|one/&
应该是
[^[:space:]]*$|one/&
使用额外的括号,你只得到'[',':','s','p','a','c','e',']'字符 - 解释为什么dir在最后一个'e'之前插入
答案 4 :(得分:0)
我想做到这一点,但没有围绕......
唯一的问题是OS X sed不会将\ t识别为TAB字符,如here所述。您必须使用实际的TAB字符。在原始帖子中使用选项1,但不要键入\t
,而是按Ctrl+v
,然后按Tab
键。这很难复制和粘贴,所以你必须自己做。 : - )