【问题标题】:grep the folder using sed command in shell script在 shell 脚本中使用 sed 命令 grep 文件夹
【发布时间】: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$//”......你能告诉我吗

标签: shell sed grep


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2023-02-06
      • 2014-06-07
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多