我正在尝试创建一个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上。
答案 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