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
$ 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.coffeesed-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