预先写下一行的最后一个单词

时间:2012-03-01 23:29:39

标签: sed

我想将目录名预先挂起到一行中的最后一个单词。该行具有以下格式:

100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^IoneFile$

其中^I表示tab$表示行尾。此行由git ls-files -s生成。

我想要一个sed命令将one/添加到此行的文件名中,如下所示:

`100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^Ione/oneFile$

我尝试过的一些行及其相应的输出:

  1. 匹配非\t后跟$的最长字符串;追加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
    
  4. 我基本上尝试了很多匹配的东西:

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

    以及上面列出的那些。我能得到的最接近的是oneFilone/e[^[[:blank:]]]*$|one/&|',或预先挂到0,但我似乎无法得到我想要的东西。

    EDIT 因为有几个人评论/发布了答案,但没有一个对我有用,我想我会补充说:我使用的是Mac OS X 10.7.3。版本sed我并不完全确定(如果有人知道如何让它随意添加评论) - man sed页面说明了这一点BSD sed。我不确定与GNU sed有什么不同,如果有的话。

    我还使用zshoh-my-zsh正在运行(相当未经修改)。我已打开extended_globsetopt extended_glob)。

    我已经对我的结果评论了人们给出的答案;我假设它们是在Linux发行版上运行的?我今晚无法访问非OS X系统,但我明天会重新开始任何答案;也许只是我的[shell|OS|bad karma]并不让他们为我工作。

    再次编辑:

    所以我在Ubuntu系统上测试过,上面的(1)确实有用。不过,我喜欢Mac的工作版本。

    最终编辑: 感谢所有使用等效命令工作的人。事实证明,我的第一个 工作,但不是BSD sed。但是,我确实有gsed可用(感谢指出这一点!)这使得这些都神奇地起作用。

5 个答案:

答案 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键。这很难复制和粘贴,所以你必须自己做。 : - )

另见this question