Sed 将单词预挂起到行的最后一个单词

Sed 将单词预挂起到行的最后一个单词,sed,Sed,我想在一行中的最后一个字前挂起一个目录名。该行具有以下格式: 100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^IoneFile$ 其中,^I表示选项卡,而$表示行尾。此行由git ls files-s生成 我需要一个sed命令将one/前置到此行中的文件名,如下所示: `100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^Ione/oneFile$ 我尝试过的一些行及其相应的输出: 匹配不是\t的

我想在一行中的最后一个字前挂起一个目录名。该行具有以下格式:

100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0^IoneFile$

其中,
^I
表示
选项卡
,而
$
表示行尾。此行由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
    
    $ git ls-files -s | sed 's|[^\t ]*$|one/&|'
    100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e one/0   oneFile
    
  • 匹配不是
    \t
    '
    后跟
    $
    的最长字符串;预挂
    one/

    $ git ls-files -s | sed 's|[^\t]*$|one/&|'  
    one/100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e 0   oneFile
    
    $ git ls-files -s | sed 's|[^\t ]*$|one/&|'
    100644 bfadfab6f98b8fa1e9989fe16b2bf0fb13ffd39e one/0   oneFile
    
  • 匹配非水平空白的最长字符串,在“one/”前面加上前缀:

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

    • [^\t]*$| one/&
    • [^[:space:][]*$| one/&
    还有上面列出的那些。我能得到的最接近的方法是使用
    oneFilone/e
    ,它是
    [^[:blank:]]*$| one/&&
    ,或者使用
    0
    ,但我似乎不能完全得到我想要的

    编辑 因为有几个人评论/发布了答案,但没有一个对我有用,我想我应该补充一句:我正在使用MacOSX10.7.3。
    sed
    的版本我不完全确定(如果有人知道如何获得它,请随意添加评论)
    man-sed
    页面说它是BSD-sed。我不确定这与GNU sed有多大不同,如果有的话

    我还使用了
    zsh
    ,运行
    ohmyzsh
    (prettymuch未修改)。我已经打开了
    extended\u glob
    setopt extended\u glob

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

    再次编辑:

    所以我已经在Ubuntu系统上进行了测试,上面的(1)确实有效。不过,我希望我的Mac电脑有一个可用的版本

    最终编辑:
    感谢所有用同等命令回答问题的人。事实证明,我的第一个可以工作,但不能使用
    BSD sed
    。然而,我确实有可用的
    gsed
    (感谢您指出!),这使得这些都能神奇地工作

    以下内容对我有用:

    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'|…
    对我有帮助。

    以下内容对我有用:

    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'|…
    对我有帮助。

    这更简单,但似乎有效:

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

    它还应该在oneFile之前使用一个选项卡。

    这更简单,但似乎可以:

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

    它还应该在oneFile之前使用一个选项卡。

    现在无法测试,但您在字符类中使用了太多的方括号

    [^[[:space:]]]*$|one/&
    
    应该是

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

    使用额外的方括号,您只会得到字符“[”、“:”、“s”、“p”、“a”、“c”、“e”、“]”——这解释了为什么在最后一个“e”之前插入dir现在无法测试,但您在字符类中使用了太多的方括号

    [^[[:space:]]]*$|one/&
    
    应该是

    [^[:space:]]*$|one/&
    
    使用额外的括号,您只会得到字符“[”,“:”,“s',“p',“a',“c',“e',”]——解释为什么在最后一个“e”之前插入目录这可能对您有用(或者我遗漏了什么?):

    这可能对你有用(或者我遗漏了什么?):


    我本来想这么做的,但却没有四处走动

    唯一的问题是OS X sed无法将\t识别为制表符,如前所述。您必须使用实际的制表符。在原始帖子中使用选项1,但不要键入
    \t
    ,而是按
    Ctrl+v
    ,然后按
    选项卡
    键。这很难复制和粘贴到此处,因此您必须自己完成。:-)


    另请参见。

    我确实想这样做,但没有gsed

    唯一的问题是OS X sed无法将\t识别为制表符,如前所述。您必须使用实际的制表符。在原始帖子中使用选项1,但不要键入
    \t
    ,而是按
    Ctrl+v
    ,然后按
    选项卡
    键。这很难复制和粘贴到此处,因此您必须自己完成。:-)


    另请参见。

    hmm,您的第一个选项似乎适合我(我创建了一个新的git存储库,提交了一个文件,并使用了选项1中的确切命令)。您也可以尝试使用显式反向引用的
    sed-r的|([^\t]+)$| one/\1 |'
    ,它使用-r开关来使用“normal”regex。在msysgit上也为我工作过,实际上1和2为我工作过。@mathematical.coffee
    sed-r
    给出了
    sed:非法选项--r
    。我正在试图弄清楚我使用的是什么版本的sed,根据手册,最好的猜测是“BSD sed”(我使用的是macosx)。哦,macosx有一个不同版本的sed(我使用的是GNU版本)。从内存中,您可以使用
    -E
    。(或者,
    ssed
    with
    -r
    )。@mathematic.coffee Awesome-with
    -E
    $git ls files-s | sed-E's |([^\t]+)$| one/\1 |
    这给了我一个
    100644 bfadFabF6F98B8FA1E9989FE16B20FB13FFD39E文件
    。嗯,你的第一个选择似乎对我有用(我创建了一个新的git存储库,提交了一个文件,并使用了确切的co