【问题标题】:How to delete a substring using shell script如何使用 shell 脚本删除子字符串
【发布时间】:2012-11-14 06:04:36
【问题描述】:

我有字符串调用:

abc.out
def.out

如何删除子字符串

.out

在这些字符串中?

我应该使用什么命令? (伯恩壳牌)

【问题讨论】:

    标签: shell substring


    【解决方案1】:

    多种方式,一种选择:

    str=abc.out

    壳牌:

    echo ${str%.*}
    

    Grep:

    echo $str | grep -o '^[^\.]*'
    

    Sed:

    echo $str | sed -E 's/(.*?)\..*/\1/'
    

    Awk:

    echo $str | awk -F. '{print $1}'
    

    -F. 表示将字符串拆分为 . $1 表示第一列。

    剪切:

    echo $str | cut -d. -f1

    所有输出:

    abc
    

    【讨论】:

      【解决方案2】:

      zsh中的一个例子:

      % myVar="abc.out def.out ghi.out"
      
      % myVar=${myVar:s/.out/} # replace first match of ".out" with ""
      % echo myVar
      abc def.out ghi.out
      
      % myVar=${myVar:gs/.out/} # replace all matches of ".out" with ""
      % echo myVar
      abc def ghi
      

      【讨论】:

        【解决方案3】:

        我发现这效果最好,因为您要使用的模式可以在变量中:

        DATA="abc.out"
        pattern=".out"
        DATA=${DATA/$pattern/}
        echo "DATA=${DATA}"
        

        结果是:

        abc

        【讨论】:

        • 也适用于前缀 :) 谢谢!
        【解决方案4】:

        如果这些是文件名,您可以使用 basename。

        $ basename a.out .out
        

        会给你:

        a
        

        【讨论】:

        • 如果您喜欢编写选项,basename -s .out a.out 也可以使用。
        【解决方案5】:

        如果这些字符串存储在一个文件中(我们称之为input_file):

        # input_file:
        
        abc.out abc.out abc.out
        def.out def.out
        def.out
        

        你可以这样做:

        sed -i 's/\.out//g' input_file
        

        这将从该文件中删除任何出现的子字符串.out

        说明:

        • sed:调用sed 工具来编辑文本流
        • -i:使用“就地”选项 - 这会修改您提供的输入文件,而不是将输出写入 stdout
        • 's/\.out//g':使用正则表达式删除.out。最后的g 表示删除所有出现的事件。
        • input_file:指定输入文件

        如果这些字符串存储在变量中:

        var1="abc.out"
        

        你可以使用parameter subsitution:

        var1=${var1%.out}
        echo "$var1"
        
        abc
        

        说明:

        【讨论】:

        • 你的 sed 版本需要一个行尾锚点,g 标志可能是不可取的。
        • @WilliamPursell 我想这取决于他文件的确切输入:你是对的,我应该让我的假设更清楚。
        【解决方案6】:
        $ foo=abc.def.out
        $ echo ${foo%.out}
        abc.def
        

        一般来说,要删除最短的后缀,请使用:

        $ echo ${foo%.*}
        abc.def
        

        要删除最长的后缀,请使用

        $ echo ${foo%%.*}
        abc
        

        【讨论】:

          猜你喜欢
          • 2012-12-21
          • 1970-01-01
          • 2016-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-20
          相关资源
          最近更新 更多