【问题标题】:extract substring until first digit提取子字符串直到第一个数字
【发布时间】:2020-02-12 03:15:32
【问题描述】:

我有以下字符串:

test1234atest1234 为例,我只想从该字符串中提取test

我尝试了以下方法

echo "Test12h" | sed -e 's/[0-9]\*$//' but is not working. 

是否有可能将子字符串提取到第一个数字?

请让我知道我想念什么。

谢谢

【问题讨论】:

    标签: bash shell sed grep


    【解决方案1】:

    从命令输出中提取与正则表达式匹配的子字符串的正确工具是grep。喜欢,

    echo "Test12h" | grep -o '^[^[:digit:]]*'
    

    将输出Test

    如果Test12h 在变量中,您甚至不需要外部实用程序;参数扩展可以轻松处理,例如:

    var='Test12h'
    echo "${var%%[[:digit:]]*}"
    

    【讨论】:

      【解决方案2】:

      请您尝试关注一下。

      sed 's/\([^0-9]*\).*/\1/' Input_file
      

      sed 's/[0-9][0-9a-zA-Z]*//' Input_file
      

      【讨论】:

        【解决方案3】:

        如果源恰好位于变量中,您可以使用parameter substitution,例如:

        $ for test in test1234a test1234 Test12h
        do
            echo "${test} => ${test//[0-9]*/}"
        done
        test1234a => test
        test1234 => test
        Test12h => Test
        

        其中一般格式为:${var//Pattern/Replacement};在上面:

        • var == 测试
        • Pattern == [0-9]*(第一次出现一个数字,然后是后面的所有内容
        • Replacement == ''(无,空字符串)

        所以我们最终会在第一次出现数字后剥离所有内容。

        【讨论】:

        • 有点挑剔,${test/[0-9]*} 应该足够了。
        【解决方案4】:

        你在尝试中犯了一个小错误:

        echo "Test12h" | sed -e 's/[0-9].*$//'    # will output Test
        

        \* 期望输入中有一个真实的*

        echo "Test1*" | sed -e 's/[0-9]\*$//'     # will output Test
        

        .* 匹配任意数量的任意字符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-02
          • 2014-01-04
          • 1970-01-01
          • 1970-01-01
          • 2011-02-05
          • 1970-01-01
          • 2021-04-15
          相关资源
          最近更新 更多