Shell脚本:如何提取下划线后的可变长度后缀字符串?
解决Shell脚本提取下划线后内容的问题
先纠正你命令里的几个关键错误:
- 变量赋值语法错误:不能直接写
new_name=cat $input,必须用命令替换$(...)捕获命令输出后再赋值; - cut命令参数缺失:用
-d指定分隔符后,必须搭配-f明确要提取的字段范围,否则会触发你看到的错误; - 多余的awk命令:你的输入是单个无空格字符串,
awk '{print $1}'完全没必要。
下面提供几种高效的解决方法:
方法一:使用cut命令
直接指定下划线为分隔符,提取第2个字段及之后的所有内容:
input="Prefixname_SuffixName-123" new_input=$(echo "$input" | cut -d'_' -f2-)
-f2-表示提取从第2个字段到最后的全部内容,即使后续字符串里还有下划线也能完整保留。
方法二:使用Shell内置参数扩展(推荐)
无需调用外部命令,利用Shell本身的参数扩展功能,效率更高:
input="Prefixname_SuffixName-123" new_input="${input#*_}"
${input#*_}的作用是:从input变量开头,删除最短的匹配*_的部分(即第一个下划线及之前的所有内容),直接得到下划线后的剩余字符串。
方法三:使用awk命令
如果偏好awk,可通过替换操作提取目标内容:
input="Prefixname_SuffixName-123" new_input=$(echo "$input" | awk -F'_' '{sub(/^[^_]+_/, ""); print}')
-F'_'指定下划线为分隔符,sub(/^[^_]+_/, "")会替换掉开头到第一个下划线的所有内容,最后打印处理后的结果。
内容的提问来源于stack exchange,提问作者Mohan Harish
相关产品推荐
相关产品推荐

