sed模式匹配不起作用

时间:2017-06-10 12:09:16

标签: bash sed

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

let decoded = try JSONDecoder().decode(Article.self, from: jsonData)

print(decoded)

// Article(tags: [
//                 AuthorTag(value: "Author Tag Value", foo: 56.7000008),
//                 GenreTag(value: "Genre Tag Value", baz: "hello world")
//               ],
//         title: "Article Title")

我明白了:

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"

正如你所看到的那样,正则表达式没有应用。

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

我在Mint 17.3上。

2 个答案:

答案 0 :(得分:2)

基于sed的解决方案将是:

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

但是,通过一些假设,您只能使用bash功能:

directory=${archive%.tar.*}

答案 1 :(得分:1)

您需要-E上的sed标记:

$ archive=binutils-2.27.tar.bz2
$ directory=$( sed "s/.tar.[a-z0-9]{2,3}$//" <<< $archive)
$ echo $directory
binutils-2.27.tar.bz2
$ directory=$( sed -E "s/.tar.[a-z0-9]{2,3}$//" <<< $archive)
$ echo $directory
binutils-2.27