regex - linux grep -oP 如何仅打印模式
问题描述
# cat a.file
123123abc file2
274efcc4d8a0e8f61397be46bd4bfa37 file1
321 file1
# file="file1"
# grep -m 1 -oP "\K([\w]+) +$file" a.file
274efcc4d8a0e8f61397be46bd4bfa37 file1
如何274efcc4d8a0e8f61397be46bd4bfa37
使用参数file1
行获取输出,并且只使用grep
没有|
或其他命令的命令awk
?
是否有grep -P
一些其他参数仅用于打印匹配模式\K([\w]+)
,例如结果是274efcc4d8a0e8f61397be46bd4bfa37
?或者是否有任何实现来获得结果grep
。
解决方案
$ file='file1'
$ grep -m1 -oP '\w+(?= +'"$file"'$)' a.file
274efcc4d8a0e8f61397be46bd4bfa37
(?=regexp)
是一个积极的前瞻结构,它可以帮助您定义一个断言,而不会将它作为匹配部分的一部分。请参阅参考资料 - 这个正则表达式是什么意思?有关环视的更多信息。
我还把 and 和 and 放在'\w+(?= +'
一起"$file"
,'$)'
这样只有 shell 变量在双引号下。此处使用$
锚点来避免部分匹配,例如file1
vsfile1a
或file11
. 如果您的文件名可以包含正则表达式元字符(例如:).
,那么您需要使用'\w+(?= +\Q'"$file"'\E$)'
来匹配文件名的字面意思。
不知道你为什么不想在awk
这里使用,它非常适合这个任务。字符串比较很方便,可以避免处理正则表达式转义。
awk -v f="$file" '$2==f{print $1; exit}'
推荐阅读
- typescript - 打字稿中的布尔列表是否有“全部”或“任何”运算符
- css - 下拉菜单中重叠的双箭头
- javascript - 如何在 Javascript 中将 Promises 与 async 和 await 一起使用
- python - Python - 在 For 循环中用一个替换多个索引
- python - 创建 OpenCV 视频小部件以在 Kivy 中使用
- amazon-web-services - AWS CodePipline (CI/CD) 用于更新现有 AWS Lambda 的代码(不是使用 CloudFormation 或 SAM 创建的)
- java - 如何让 hibernate-ogm 在 jboss eap 7.2 上工作?
- angular - Angular“解析 http://localhost:8000/excel 期间的 Http 失败”
- python - 为两个给定的百分位值拟合对数范数分布
- mongodb - 如何将所有数据从一个 Mongodb 云项目复制到另一个?