【发布时间】:2020-02-12 03:15:32
【问题描述】:
我有以下字符串:
以test1234a 或test1234 为例,我只想从该字符串中提取test。
我尝试了以下方法
echo "Test12h" | sed -e 's/[0-9]\*$//' but is not working.
是否有可能将子字符串提取到第一个数字?
请让我知道我想念什么。
谢谢
【问题讨论】:
我有以下字符串:
以test1234a 或test1234 为例,我只想从该字符串中提取test。
我尝试了以下方法
echo "Test12h" | sed -e 's/[0-9]\*$//' but is not working.
是否有可能将子字符串提取到第一个数字?
请让我知道我想念什么。
谢谢
【问题讨论】:
从命令输出中提取与正则表达式匹配的子字符串的正确工具是grep。喜欢,
echo "Test12h" | grep -o '^[^[:digit:]]*'
将输出Test。
如果Test12h 在变量中,您甚至不需要外部实用程序;参数扩展可以轻松处理,例如:
var='Test12h'
echo "${var%%[[:digit:]]*}"
【讨论】:
请您尝试关注一下。
sed 's/\([^0-9]*\).*/\1/' Input_file
或
sed 's/[0-9][0-9a-zA-Z]*//' Input_file
【讨论】:
如果源恰好位于变量中,您可以使用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]*} 应该足够了。
你在尝试中犯了一个小错误:
echo "Test12h" | sed -e 's/[0-9].*$//' # will output Test
\* 期望输入中有一个真实的*:
echo "Test1*" | sed -e 's/[0-9]\*$//' # will output Test
.* 匹配任意数量的任意字符。
【讨论】: