bash - sed 模式匹配不起作用

标签 bash sed

我正在尝试创建一个 bash 脚本来自动提取 tar 文件,但我的 sed 正则表达式未按预期运行。如果我这样做:

archive=$1
directory=$(sed "s/.tar.bz2$//" <<< $archive)
echo "extracting $archive to $directory"

我明白了:

$ sh extract binutils-2.27.tar.bz2
extracting binutils-2.27.tar.bz2 to binutils-2.27

这符合预期。

但如果我这样做:

archive=$1
directory=$(sed "s/.tar.[a-z0-9]{2,3}$//" <<< $archive)
echo "extracting $archive to $directory"

这就是我想要做的(以便处理任何类型的存档),我希望得到相同的输出,但我得到:

$ sh extract binutils-2.27.tar.bz2
extracting binutils-2.27.tar.bz2 to binutils-2.27.tar.bz2

如您所见,正则表达式不适用。

我已经在 regex101.com 上测试了我的正则表达式,它似乎是正确的,但它似乎在 bash 脚本中无法正常工作。有人可以指出我出了什么问题的正确方向吗?

我使用的是 Mint 17.3。

最佳答案

基于 sed 的解决方案是:

directory=$(sed -E 's/\.tar\.[a-z0-9]{2,3}$//' <<< $archive)

但是,根据一些假设,您只能使用 bash 功能:

directory=${archive%.tar.*}

关于bash - sed 模式匹配不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44473158/

相关文章:

bash - 如何通过在 bash 脚本中输入两次来安全地确认密码

linux - 使用 awk 从 grep 匹配中提取文本并并排放置

linux - 我可以在 sed 脚本中声明变量/数组吗?

linux - 如何grep这个包含等号的字符串?

linux - 连接 echo 的结果和命令输出

linux - 在端口 10334 连接到定位器的第二个 geode 容器的问题

bash - 在 Bash 中,如何找到编号最小的未使用文件描述符?

regex - 在 sed 中用单个选项卡替换选项卡

linux - 如何提取字符串的一部分?

linux - 使用 sed/grep 更新匹配行