regex - 如何让 sed 记忆模式产生预期的输出?
问题描述
我试图让替换模式提取名字的第一个字母(假定为大写)和整个姓氏,但忽略任何中间名'
例如:
John Doe应该产生JDoe
John Andrew DoeJDoe
也应该产生
我已经尝试了以下方法,我得到的只是我输入的内容,John Doe
:
echo 'John Doe ' | sed -E 's/\([A-Z]\){1}((a-z)+) ([A-Z][a-z]+)* \([A-Z]{1}[a-z]+\)/\1/g'
解决方案
使用sed
和扩展正则表达式,您可以执行以下操作:
$ echo "John Doe" | sed -r 's/^(\w).*\s(\w+)$/\u\1\u\2/'
JDoe
或在中间放置任意数量的字符,然后在其后加一个空格,"John"
结果"Doe"
是相同的:
$ echo "John Andres Doe" | sed -r 's/^(\w).*\s(\w+)$/\u\1\u\2/'
JDoe
基本上:
- 定位
\w
锚定在开头的第一个(单词字符)并将字符收集到(...)
捕获组中; .*\s
跳过后跟空格字符的任意数量的字符;\w+$
收集输入中的最终单词;- (没有人对第一个字符的情况做出任何假设)
- 替换是
\u\1\u\2
将\u
第一个字符转换为大写的地方,\1
并且\2
是反向引用重新插入捕获组中捕获的内容。
例如:
$ echo "john james dan doe" | sed -r 's/^(\w).*\s(\w+)$/\u\1\u\2/'
JDoe
看看事情,如果你有问题,请告诉我。
推荐阅读
- python - Python 中没有重复的随机对(numpy 或 itertools)
- python - (django.db.utils.OperationalError: near ")": 语法错误) 在创建 custon django 用户模型时
- java - 根据Java程序返回的数据终止socat连接
- java - 图像捕获后,Android Image FIle 变量变为空
- javascript - 如何从嵌套数组 JavaScript/React 返回数组
- ios - 如果您为子视图设置前导和尾随锚点,为什么 UIScrollView 不起作用?
- javascript - javascript canvas 中的 ctx 未定义
- asp.net-core - 导航返回时表单保留值
- python - Pandas DateTime 仅部分显示在 Matplotlib 中
- react-native - 如果应用程序被用户关闭,则 React Native 简单的本地模块打开应用程序