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