bash - 如何在 BSD tar 路径替换选项中转义字符

标签 bash escaping bsdtar

这不起作用:

$ tar -cf /tmp/z.tar -C /space/myroot -s '/^\.svn\/patches/__patches' src .svn/patches
tar: Invalid regular expression: trailing backslash (\)
也不好:
$ tar -cf /tmp/z.tar -C /space/myroot -s '/^\\.svn\\/patches/__patches' src .svn/patches
tar: Invalid replacement flag _
反斜杠(最多 4 个)和引号的每种组合都会给我这两个错误之一。但是我知道第一个在 sed 中工作:
$ tar -cf /tmp/z.tar -C /space/myroot src .svn/patches
$ tar -tf /tmp/z.tar | sed 's/^\.svn\/patches/__patches/'
src/a.c
src/b.c
__patches/A.patch
__patches/B.patch
我也知道我可以逃避并这样做:
$ tar -cf /tmp/z.tar -C /space/myroot -s '/^.svn.patches/__patches' src .svn/patches
——但我真的不想。

最佳答案

来自 man bsdtar :

-s pattern
....
where old is a basic regular expression
...

Basic regular expression应该与 \/ 一起使用。可悲的是,bsdtar 在这里写错了,并且没有正确处理转义。

来自 bsdtar/subst.c :

end_pattern = strchr(rule_text + 1, *rule_text);

rule_text 是一个字符串 char * ,它与您传递给 -s 选项的字符串一起传递,因此它具有字符串 /^\.svn\/patches/__patchesend_pattern 应该指向模式的最后一个字符(即指向 /__patches 中的 /)。但是,由于使用了简单的 strchr,因此使用了找到的第一个 /(\/ 中的字符),无论是否转义,都使用它。错误:

tar: Invalid regular expression: trailing backslash (\)

来自regcomp试图解析正则表达式 ^\.svn\(因为这是两个 / 之间剥离的部分)。由于表达式中尾随反斜杠 \ 后面没有任何内容,因此它会引发错误(并且是正确的 - 尾随反斜杠在那里)。可以考虑向 bsdtar 开发人员发布错误报告,但它可能真的不值得修复。

请注意,-s 的语法是/old/new/。模式中有一个尾随 / ,您缺少它。在最后一个 / 之后,您可以指定标志。

不过,您可以通过以下方式解决此问题:

bsdtar -s '#\.svn/patches#__patches#'

任何字符都适用于 /

关于bash - 如何在 BSD tar 路径替换选项中转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54110172/

相关文章:

linux - 在后台 bash 脚本中启动下标,以便当我关闭终端/ssh session 时它仍然运行

mongodb - bash中嵌套引号的问题:通过ssh在docker容器中查询的mongodump

json - JSON 字段 POSTGRESQL 中的单引号

java - 如何使用转义序列将字符串放入 href (<a href=>Demo</a>) 中?

windows - Vagrant,运行 vagrant up 时出错 --provider=docker

macos - 为什么 `vagrant box add` 在 Ubuntu 中导入 `bsdtar` 会产生 `.box` 错误?

bash - 从 XML 文件中删除特定的重复行

regex - sed 命令在 solaris 中有效,但在 Linux 中无效

vb.net - 在VB中的字符串中使用左双引号