Bash 如何在BSD tar路径替换选项中转义字符
这不起作用:Bash 如何在BSD tar路径替换选项中转义字符,bash,escaping,bsdtar,Bash,Escaping,Bsdtar,这不起作用: $tar-cf/tmp/z.tar-C/space/myroot-s'/^\.svn\/patches/\uu patches'src.svn/patches tar:无效的正则表达式:尾随反斜杠(\) 也没有好处: $tar-cf/tmp/z.tar-C/space/myroot-s'/^\\\\.svn\\/patches/_patches'src.svn/patches tar:无效的替换标志_ 每一个反斜杠(最多4个)和引用的组合都会给我这两个错误中的一个。但是,我知道
$tar-cf/tmp/z.tar-C/space/myroot-s'/^\.svn\/patches/\uu patches'src.svn/patches
tar:无效的正则表达式:尾随反斜杠(\)
也没有好处:
$tar-cf/tmp/z.tar-C/space/myroot-s'/^\\\\.svn\\/patches/_patches'src.svn/patches
tar:无效的替换标志_
每一个反斜杠(最多4个)和引用的组合都会给我这两个错误中的一个。但是,我知道第一个在sed中有效:
$tar-cf/tmp/z.tar-C/space/myroot src.svn/patches
$tar-tf/tmp/z.tar | sed's/^\.svn\/patches/u_upatches/'
src/a.c
src/b.c
__补丁
__补丁
我也知道我可以逃避并这样做:
$tar-cf/tmp/z.tar-C/space/myroot-s'/^.svn.patches/_patches'src.svn/patches
--但我真的不想这么做。来自:
-s模式..
其中old是一个基本正则表达式
... 应与
\/
一起使用。遗憾的是,bsdtar
在这里写得不正确,无法正确处理转义
发件人:
rule\u text
是一个字符串char*
,它与传递给-s
选项的字符串一起传递,因此它具有字符串/^\.svn\/patches/\u patches
。end\u模式
应指向模式的最后一个字符(即指向/\u补丁
的from中的/
)。但是,由于使用了简单的strchr,因此将使用找到的第一个/
字符(\/
中的字符),无论是否转义,都将使用它。错误:
tar: Invalid regular expression: trailing backslash (\)
来自尝试解析正则表达式^\.svn\
(因为这是在两个/
之间剥离的部分)。由于表达式中的尾随反斜杠\
后面没有任何内容,因此它会抛出一个错误(并且是正确的-尾随反斜杠在那里)。可以考虑向bsdtar开发人员发布错误报告,但它可能并不真正值得修复
请注意,-s
的语法是/old/new/
。模式中有一个尾随的/
,您缺少它。在最后一次/
之后,可以指定标志
但是,您可以通过以下方式解决此问题:
bsdtar -s '#\.svn/patches#__patches#'
任何字符都适用于/
来自:
-s模式..
其中old是一个基本正则表达式
... 应与
\/
一起使用。遗憾的是,bsdtar
在这里写得不正确,无法正确处理转义
发件人:
rule\u text
是一个字符串char*
,它与传递给-s
选项的字符串一起传递,因此它具有字符串/^\.svn\/patches/\u patches
。end\u模式
应指向模式的最后一个字符(即指向/\u补丁
的from中的/
)。但是,由于使用了简单的strchr,因此将使用找到的第一个/
字符(\/
中的字符),无论是否转义,都将使用它。错误:
tar: Invalid regular expression: trailing backslash (\)
来自尝试解析正则表达式^\.svn\
(因为这是在两个/
之间剥离的部分)。由于表达式中的尾随反斜杠\
后面没有任何内容,因此它会抛出一个错误(并且是正确的-尾随反斜杠在那里)。可以考虑向bsdtar开发人员发布错误报告,但它可能并不真正值得修复
请注意,-s
的语法是/old/new/
。模式中有一个尾随的/
,您缺少它。在最后一次/
之后,可以指定标志
但是,您可以通过以下方式解决此问题:
bsdtar -s '#\.svn/patches#__patches#'
任何字符都适用于
/
谢谢-我没有想过尝试其他分隔符,因为tar的手册页没有提到它。另外,我问题中缺少的分隔符只是一个剪切/粘贴错误。谢谢-我没有想到尝试其他分隔符,因为tar的手册页没有提到它。另外,我问题中缺少的分隔符只是一个剪切/粘贴错误。