如何替换 SVN 转储分支名称中的空格字符?

如何替换 SVN 转储分支名称中的空格字符?

我想用下划线 ( ) 替换分支名称中的空格 ( ) 字符_。例如,假设我有一个sed测试文件包含:

Node-path: trunk/
Node-path: trunk/src/lib 0
Node-path: trunk/src/lib 0/bla.txt
Node-path: branches/ branch0-blabla_blabla/src
Node-path: branches/ branch0-blabla_blabla
Node-path: branches/branch1 stuffthing
Node-path: branches/branch1 stuffthing/src/lib 0
Node-path: branches/branch1 stuffthing/src/lib 0/bla.txt
Node-path: branches/branch2stuffthing/src/lib 0/bl a.txt

我希望将其修改为这样:

Node-path: trunk/
Node-path: trunk/src/lib 0
Node-path: trunk/src/lib 0/bla.txt
Node-path: branches/_branch0-blabla_blabla/src
Node-path: branches/_branch0-blabla_blabla
Node-path: branches/branch1_stuffthing
Node-path: branches/branch1_stuffthing/src/lib 0
Node-path: branches/branch1_stuffthing/src/lib 0/bla.txt
Node-path: branches/branch2stuffthing/src/lib 0/bl a.txt

我遇到了与中描述的问题类似的问题这个问题。但是,该问题要求替换路径中的所有空格。我想仅替换分支名称中的空格。

从另一个问题中,我已将sed命令修改为:

sed '/^Node-path: branches\//s/ /_/2' < sedtest

但它还将最后一行修改为Node-path: branches/branch2stuffthing/src/lib_0/bl a.txt,应保持不变。我的经验sed非常有限,我无法正确地将“搜索区域”限制为branches/和之间的内容/$,以先到者为准。我使用的是 CentOS 7。

至于我想要实现的目标:我正在尝试将我们的 SVN 存储库移植到 git 存储库,并且根据这个答案关于SO根据我个人的经验,git 分支名称中不能有空格。我正在尝试按照建议通过 svn 转储来修复此问题在 svnbook.red-bean.com 上

我想我可以 grep 所有有问题的分支并手动替换字符串,但这会不太通用,需要更多工作,并且少得多的娱乐性

答案1

我构建了以下sed命令:

$ sed '/^Node-path: branches\//s/Node-path: branches\/\([-A-Za-z0-9]*\) \
   \([-A-Za-z0-9]*\)/Node-path: branches\/\1_\2/' < sedtest

它看起来又大又丑,但它适用于这种情况。

请注意,它不会修复分支名称中多次出现的空格,而只会修复一次(因此如果需要,我将重新运行该命令)。


附带说明一下,如果您这样做是为了修复 SVN 转储,请不要忘记以Node-copyfrom-path:相同的方式修复这些行。

答案2

 sed '/^Node-path: branches\/ /s/ /_/2' < sedtest

查看分支后两个斜杠之间的空间

答案3

Perl 回溯使它变得更简单,尽管我不会要求太多:

perl -ple 's:^Node-path: branches/\K([^ /]*) :$1_:' <file

或者 awk,它可以通过更改为 gsub 来处理分支名称中的多个空格:

awk -F/ -vOFS=/ '$1=="Node-path: branches"{sub(/ /,"_",$2)} 1' <file

相关内容