在 shell 脚本中使用 sed 命令 grep 文件夹
Posted
技术标签:
【中文标题】在 shell 脚本中使用 sed 命令 grep 文件夹【英文标题】:grep the folder using sed command in shell script 【发布时间】:2022-01-12 09:12:14 【问题描述】:我正在尝试从完整的 tar 文件中 grep 文件夹名称。下面是例子。
示例:
TEST-5.3.0.0-build1.x86_64.tar.gz
我想在 shell 脚本中 grep 文件夹名称 (TEST-5.3.0.0-build1)
所以我尝试了下面的 grep 命令
$ package_folder=$(echo TEST-5.3.0.0-build1.x86_64.tar.gz | sed -e "s/.[0-9]*[a-z]*[0-9]*.tar.gz$//" | sed -e 's/\/$//')
但我的输出低于:
$ echo $package_folder
TEST-5.3.0.0-build1.x86
请任何人纠正我在哪里做错了。我需要文件夹名称为 TEST-5.3.0.0-build1
提前致谢!!!
【问题讨论】:
更好的是我可以使用 uname -m 而不是架构的硬代码。但是当我尝试时,它抛出了一个错误“s/.uname -m.tar.gz$//”......你能告诉我吗 【参考方案1】:在您的命令中,您不匹配 _
、x
等。[0-9]*[a-z]*[0-9]*
仅匹配零个或多个数字、零个或多个(小写)字母以及零个或多个数字的序列。最好使用[^.]*
在两个.
字符之间匹配除.
之外的任何字符。此外,文字点必须转义,否则未转义的 .
将匹配任何单个字符。
你可以使用
sed 's/\.[^.]*\.tar\.gz$//'
或者,只需使用字符串操作 如果 x86_64
也是一个常量:
s='TEST-5.3.0.0-build1.x86_64.tar.gz'
s="$s/.x86_64.tar.gz/"
见online demo:
#!/bin/bash
s='TEST-5.3.0.0-build1.x86_64.tar.gz'
package_folder=$(sed 's/\.[^.]*\.tar\.gz$//' <<< "$s")
echo "$package_folder"
# => TEST-5.3.0.0-build1
s="$s/.x86_64.tar.gz/"
echo "$s"
# => TEST-5.3.0.0-build1
【讨论】:
仅供参考,s="$s/.$(uname -m).tar.gz/"
还有works。【参考方案2】:
您可以使用uname -m
替换该字符串的部分:
s='TEST-5.3.0.0-build1.x86_64.tar.gz'
echo "$s%.$(uname -m)*"
TEST-5.3.0.0-build1
或者使用sed
:
sed "s/\.$(uname -m).*//" <<< "$s"
TEST-5.3.0.0-build1
【讨论】:
【参考方案3】:使用sed
$ package_folder=$(echo "TEST-5.3.0.0-build1.x86_64.tar.gz" | sed 's/\(.*\)\.x86.*/\1/')
$ echo "$package_folder"
TEST-5.3.0.0-build1
【讨论】:
以上是关于在 shell 脚本中使用 sed 命令 grep 文件夹的主要内容,如果未能解决你的问题,请参考以下文章