[英]Regex Must Match a Word (not to replace) AND a Pattern (to replace) in a Line
使用正则表达式(可以是 PCRE 或 SED,但也可以是 python [请指定]),我想删除所有出现的包含单个字母逗号(/,.,/g)
和单词“Labels:”的行
因此,例如在这些行中:
Labels: K,ltemittel,System,j,Vakuum,s
Another tags: a,b,xxx,c,yyy,z
至
Labels: ltemittel,System,Vakuum
Another tags: a,b,xxx,c,yyy,z
我试过的:
/(Labels:)*(,.,)
(也捕获非“标签:”) 使用sed
$ sed '/Labels:/s/,[A-Za-z]\>//g;s/\<[A-Za-z],//' input_file
Labels: ltemittel,System,Vakuum
Another tags: a,b,xxx,c,yyy,z
说明(由 Tripleee 添加)
它查找逗号,后跟字母,然后是单词边界,即逗号后面的 label 是单个字母。 然后,它通过类似的逻辑在逗号之前删除任何剩余的单字母 label
您可能会使用:
(?i)(^(?!Labels:).*)|\b[a-z],|,[a-z]\b
查看在线演示
(?i)
- 设置不区分大小写的匹配 'on';(
- 打开第一个捕获组;
^
- 开始字符串锚;(?:labels:)
- 断言 position 后面没有“标签:”;.*
- 匹配(贪婪)除换行符以外的 0+ 个字符;)
- 关闭第一个捕获组;|
- 或者;\b[az],
- 匹配一个单词边界,后跟一个字母和一个逗号;|
- 或者;,[az]\b
- 匹配逗号后跟单个字母和单词边界。现在用你的第一个捕获组替换它。
使用gnu-awk
另一个变体。
对于以Labels:
用空字符串替换逗号后跟单个字符 az 或 AZ 和单词边界。
awk '/^Labels:/{gsub(/,[a-zA-Z]\y|\y[a-zA-Z],/, "")};1' file
Output
Labels: ltemittel,System,Vakuum
Another tags: a,b,xxx,c,yyy,z
由于您已标记 Python 和 pcre,另一种选择是使用\G
锚并匹配Label:
在字符串的开头,并在第 1 组中捕获您要保留的内容。
(?:^Labels:\h*|\G(?!^))\K(?:([^\s,]{2,}(?:,(?![a-z]$))?)|,?[a-z],?)
请参阅使用 Python PyPi 正则表达式模块的正则表达式演示和Python 演示。
使用perl :
perl -lpe 's/(?:,[^,](?=,|$))+//g if s/^Labels:\s*\K(?:[^,](?:,|$))*//' file
匹配“标签:”(即\K
ept)后,删除任何前导单字符项。 如果发生这种情况,请删除所有其他单字符项目。 这假定“标签:”部分不能包含用逗号分隔的单个字符。
$ cat file
Labels: K,ltemittel,a System z,j,Vakuum,s
Another tags: a,b,xxx,c,yyy,z
$ perl -lpe 's/(?:,[^,](?=,|$))+//g if s/^Labels:\s*\K(?:[^,](?:,|$))*//' file
Labels: ltemittel,a System z,Vakuum
Another tags: a,b,xxx,c,yyy,z
注意:在上述测试中, System
已更改为a System z
。 依赖匹配空格或单词边界的解决方案可能无法正确处理此输入。
这可能对您有用(GNU sed):
sed -E '/Labels/{s/( )\S,|(,)\S,|,\S$/\1\2/g;s//\1\2/g}' file
如果一行包含Labels
,则模式匹配 3 个备用匹配,并且如果第一个和第二个匹配替换为匹配的反向引用。 重复任何重叠。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.