最近我需要从我的版本控制系统中删除新的未跟踪文件。在 Linux 中我使用:
hg status -un|xargs rm
效果很好,但在 Windows 中执行时,hg status
会列出带有反斜杠的路径,因此会出现问题。因此我尝试:
hg status -un|sed 's/\\/\//g'
...但我收到了错误:sed:-e 表达式 #1,字符 8:未终止的“s”命令
然后我尝试一些 ascii:
`hg status -un|sed 's/\o134/\o57/g'`
...这让我:sed:-e 表达式 #1,字符 14:尾随反斜杠
还有一些脚本:
hg status -un|sed 's/`echo \`/`echo /`/g'
...这让我:sed:-e 表达式 #1,字符 19:'s' 的未知选项
我尝试了最后一个字符,并得到了预期的输出……所以我完全迷失了。当然,我有 cygwin,我想避免使用文件(这就是我一直在做的)。
提前致谢
答案1
duke!你做错了!你可以使用:
而不是/
正则表达式:
hg status -un|sed 's:\\:/:g'
*捂脸*
答案2
为了避免“尾随反斜杠”错误,您应该确保不要删除最后一个反斜杠。这可以通过在正则表达式中确保另一个“非”反斜杠字符始终跟在被替换的字符后面来实现。sed 应该看起来像这样......
sed "s:\\([^\]\+\):/\1:g"
..大致翻译如下:
找到一个反斜杠,后面跟着至少 1 个非反斜杠字符,然后将其替换为正斜杠,后面跟着其他匹配的字符。
请注意,在我的正则表达式(用于 bash)中,我不需要转义反斜杠,但需要转义圆括号。'\1' 是反向引用。
希望这是有意义的!