首页 > 解决方案 > 防止 sed 中的 \S 匹配标签 (

,

)

问题描述

尝试在 bash 中制作自定义脚本:

GENDER=M
T='<p>He§She is a very handsome§beautiful man§woman</p>'
[[ $GENDER = M ]] && sed 's:§\S*::g' <<< "$T" || sed 's:\S*§::g' <<< "$T"

Output: <p>He is a very handsome man
Desired: <p>He is a very handsome man</p>

同样地:

GENDER=F
T='<p>He§She is a very handsome§beautiful man§woman</p>'
[[ $GENDER = M ]] && sed 's:§\S*::g' <<< "$T" || sed 's:\S*§::g' <<< "$T"

Output: She is a very beautiful woman</p>
Desired: <p>She is a very beautiful woman</p>

有任何想法吗?谢谢你。

标签: bashsed

解决方案


这里的问题是当你不想要它时\S匹配<和字符。>

从 using 切换\S到 POSIX 字符类不仅使您的代码与更多版本的 兼容sed,而且还允许您控制向类添加额外字符,在这种情况下是<and >

selectWords() {
  case $1 in
    M) sed 's:§[^[:space:]<>]*::g' <<<"$2" ;;
    *) sed 's:[^[:space:]<>]*§::g' <<<"$2" ;;
  esac
}

selectWords M '<p>He§She is a very handsome§beautiful man§woman</p>'
selectWords F '<p>He§She is a very handsome§beautiful man§woman</p>'

...正确发出

<p>He is a very handsome man</p>
<p>She is a very beautiful woman</p>

推荐阅读