bash - 防止 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>
有任何想法吗?谢谢你。
解决方案
这里的问题是当你不想要它时\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>
推荐阅读
- atata - 带有 text() 的 XPath 以获取特定的文本节点
- python - 如何从数据框中的 url 中删除子文件夹和扩展名
- material-ui - 有没有办法从 DatePicker 的弹出对话框中删除“工具栏”?
- mysql - 替换中的Wordpress Mysql编号值
- c++ - 使用多个输入时无法从 BufferSink 检索有效的过滤帧
- r - 如何仅在 R 中的显着性检验中获取 p 值
- mongodb - 聚合以在文档中插入数组值
- javascript - 具有日历日期范围的数据过滤器
- ansible - 带有 become_method=pbrun 的 Ansible 剧本不起作用
- python - Selenium Python - 过时的元素引用异常