Bash中strstr()替代方案:提取字符串至子串末尾
在Bash中实现类似strstr()的子串截取功能
问题原因
你用Awk时遇到的问题是:-F'myvar'会把字符串myvar直接作为字段分隔符,而非引用变量myvar的值,导致无法正确分割字符串,因此输出了整个原内容。
以下是几种可行的解决方案:
方案一:Bash原生字符串操作(高效无外部依赖)
Bash本身支持字符串匹配截取,无需调用外部工具,语法简洁且效率高:
str="this is a long string" substring="long" # 先判断子串是否存在 if [[ "$str" == *"$substring"* ]]; then # 截取子串之前的部分 + 子串本身 result="${str%%$substring*}${substring}" echo "$result" else echo "子串未找到" fi
输出结果:
this is a long
${str%%$substring*}:从字符串末尾向前匹配,删除第一个$substring及之后的所有内容,得到子串之前的部分- 拼接
$substring后,即得到从开头到子串结尾的完整内容
方案二:修正Awk命令
要让Awk使用变量作为分隔符,需要在BEGIN块中设置字段分隔符FS,或者直接用match函数定位子串:
方法1:通过FS变量分割
str="this is a long string" substring="long" awk -v myvar="$substring" 'BEGIN{FS=myvar} {print $1 myvar}' <<< "$str"
方法2:用match函数精准截取
awk -v str="$str" -v sub="$substring" 'BEGIN{ if (match(str, sub)) { print substr(str, 1, RSTART + RLENGTH - 1) } }'
match(str, sub):查找子串在原字符串中的位置,RSTART是子串起始索引,RLENGTH是子串长度substr(str, 1, RSTART + RLENGTH - 1):截取从字符串开头到子串结尾的部分
方案三:使用sed命令
利用sed的正则替换功能,匹配子串及后续内容并替换为子串本身:
str="this is a long string" substring="long" if [[ "$str" == *"$substring"* ]]; then sed "s/\($substring\).*/\1/" <<< "$str" else echo "子串未找到" fi
内容的提问来源于stack exchange,提问作者mwas
相关产品推荐
相关产品推荐

