我想用下划线 ( ) 替换分支名称中的空格 ( ) 字符
_
。例如,假设我有一个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