繁体   English   中英

正则表达式必须匹配一行中的一个单词(不替换)和一个模式(替换)

[英]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 -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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM