如何移除变量中带指定前缀后缀的所有子串?求sed/awk解决方案
移除字符串中标签及其内容的sed/awk解决方案
问题场景
给定变量内容:
sentence="<Name>Mary</Name> has a little lamb it's fleece as white as snow and everywhere that <Name>Sharon</Name> went the lamb was sure to go. <Name>Lucy</Name>, <Name>Mary</Name> quite contrary how does your garden grow?"
需要移除所有以<Name>开头、</Name>结尾的内容(包括标签本身),最终得到:
sentence=" has a little lamb it's fleece as white as snow and everywhere that went the lamb was sure to go. , quite contrary how does your garden grow?"
解决方案
1. sed 实现
用sed的全局替换功能,通过正则精准匹配单个<Name>标签块:
# 直接输出处理后的结果 echo "$sentence" | sed 's/<Name>[^<]*<\/Name>//g' # 直接更新变量(bash环境) sentence=$(echo "$sentence" | sed 's/<Name>[^<]*<\/Name>//g')
说明:
s/匹配规则/替换内容/g:g表示全局替换所有匹配项,而非只替换第一个<Name>[^<]*<\/Name>:<Name>开头后,匹配任意非<的字符(避免跨标签匹配),直到</Name>结尾,确保只清除单个标签及其内部内容
2. awk 实现
利用awk的gsub函数做全局替换,逻辑和sed一致:
# 直接输出处理后的结果 echo "$sentence" | awk '{gsub(/<Name>[^<]*<\/Name>/, ""); print}' # 直接更新变量(bash环境) sentence=$(echo "$sentence" | awk '{gsub(/<Name>[^<]*<\/Name>/, ""); print}')
说明:
gsub(regex, replacement):默认对当前行做全局替换,把匹配到的标签块替换为空字符串,最后打印处理后的行
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

