关于sed:在一行的最后一个单词上预先添加单词


pre-pend word to the last word of a line

我想把目录名预先挂起到一行中的最后一个字。行的格式如下:

100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^IoneFile$

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

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

江户十一〔七〕号

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

  • 匹配非\t后接$的最长字符串;追加one/

    1
    2
    $ git ls-files -s | sed 's|[^\t]*$|one/&|'  
    one/100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0   oneFile
  • 匹配不是\t' '的最长字符串,后跟$;预挂起的one/

    1
    2
    $ git ls-files -s | sed 's|[^\t ]*$|one/&|'
    100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e one/0   oneFile

  • 匹配不是水平空白的最长字符串,在"one/"前面加上:

    1
    2
    $ git ls-files -s | sed 's|[^[[:blank:]]]*$|one/&|'
    100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0   oneFilone/e
  • 我基本上尝试了一系列匹配的东西:

    • 埃多克斯1〔15〕
    • 江户十一〔16〕号

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

    编辑因为有几个人评论/发布了答案,而这些答案对我都不起作用,我想我应该补充一下:我使用的是Mac OS X 10.7.3。我不完全确定(如果有人知道如何让它自由添加评论)的man sed页面说它是一个bsd-sed。我不知道这和GNU sed有什么不同。

    我也在使用zshoh-my-zsh正在运行(未修改)。我打开了extended_glob(setopt extended_glob)。

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

    再次编辑:

    所以我在Ubuntu系统上进行了测试,上面的(1)确实有效。不过,我还是喜欢我的Mac电脑的工作版本。

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


    这可能对你有用(或者我错过了什么吗?):

    1
    2
    echo -e"100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0\toneFile" | sed 's/\t/&one\//'
    100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0       one/oneFile


    现在无法测试,但字符类使用的括号太多。

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

    应该是

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

    使用额外的括号,您只会得到字符"["、':"、's'、'p'、'a'、'c'、'e'、']'——解释为什么目录插入到最后一个'e'之前


    这很简单,但似乎有效:

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

    它应该在一个文件之前使用一个选项卡。


    以下对我有效:

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

    100644 345242cb0c4e9bb01a6fef9947f4342ff2f68553 0       one/ExView/resource.h

    本来应该是

    1
    100644 345242cb0c4e9bb01a6fef9947f4342ff2f68553 0       ExView/resource.h

    我也遇到了一些奇怪的新品问题。我怀疑这是你的问题,但在过去,git ls-files -s | tr -d '
    ' | ...
    对我有帮助。


    我本想这么做的,但却没有四处转悠…

    唯一的问题是,OS X SED不能将 识别为制表符,如本文所述。必须使用实际的制表符。在原始日志中使用选项1,但不要键入\t,而是按Ctrl+v,然后按Tab键。这是很难复制和粘贴在这里,所以你必须自己做。-)

    另请参见此问题。