Regex 如何用正则表达式模式匹配具有固定前缀的可变长度单词?
摘要 一个正则表达式模式如何匹配我认为最好的描述为“具有固定前缀的可变长度单词” 详细信息 下面的示例尝试删除Regex 如何用正则表达式模式匹配具有固定前缀的可变长度单词?,regex,sed,key-value,Regex,Sed,Key Value,摘要 一个正则表达式模式如何匹配我认为最好的描述为“具有固定前缀的可变长度单词” 详细信息 下面的示例尝试删除aa:22。它们都不起作用 所有命令的首选输出为bb:33 cc:44。当然,这些命令并不是为了删除前导空格或额外空格而设计的 我使用perl-pe(在第一个命令中失败),试图使可变长度模式匹配为“非贪婪” 在这些示例中,aa:是前缀(可以认为是键值对中的“键”),而22是可变内容、可变长度值;也就是说,它可以是aa:2vED/3rD@&x3J{ZB334}A(在这种语法中,任何包含非空
aa:22
。它们都不起作用
所有命令的首选输出为bb:33 cc:44
。当然,这些命令并不是为了删除前导空格或额外空格而设计的
我使用perl-pe
(在第一个命令中失败),试图使可变长度模式匹配为“非贪婪”
在这些示例中,aa:
是前缀(可以认为是键值对中的“键”),而22
是可变内容、可变长度值;也就是说,它可以是aa:2vED/3rD@&x3J{ZB334}A
(在这种语法中,任何包含非空白字符的字符串,而不是:
),但它将始终以空白为右侧边框(空格和制表符是唯一的空白字符,是吗?)或行尾
此外:可以按任何顺序找到单词序列(键值对)。因此,基于awk的固定列匹配可能不起作用
我正在寻找一个优雅、简单的解决方案。我读过很多关于堆栈溢出的答案,它们的正则表达式看起来非常长,非常复杂,以至于无法理解。显然,我没有受过足够的正规教育
sed、perl、awk、grep或任何其他面向POSIX的解决方案都是可以接受的,只要该解决方案与基准macOS和Linux的兼容性最低
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:.*\b||'
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:.*?\b||'
22 bb:33 cc:44
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:\B*\b||'
22 bb:33 cc:44
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa\B*\b||'
:22 bb:33 cc:44
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:(?!.*)\b||'
aa:22 bb:33 cc:44
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:(?!.*)*\b||'
22 bb:33 cc:44
$
$ echo 'aa:22 bb:33 cc:44' | perl -pe 's|aa:.*^(?!.*)||'
aa:22 bb:33 cc:44
$
$ echo 'reordering...'
reordering...
$
$ echo 'bb:33 aa:22 cc:44' | perl -pe 's|aa\B*\b||'
bb:33 :22 cc:44
$
$
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G1012
$
这可能会起作用:
echo 'aa:22 bb:33 cc:44' | sed -r 's/aa:[^ ]+ //g'
bb:33 cc:44
它查找aa
和所有其他字符,直到第一个空格
$ echo 'aa:22 bb:33 cc:44' | sed -E 's/aa:[^[:space:]:]*([[:space:]]|$)//'
bb:33 cc:44
$ echo 'bb:33 aa:22 cc:44' | sed -E 's/aa:[^[:space:]:]*([[:space:]]|$)//'
bb:33 cc:44
$ echo 'bb:33 cc:44 aa:22' | sed -E 's/aa:[^[:space:]:]*([[:space:]]|$)//'
bb:33 cc:44
用于ERE支持-E
匹配0+除wspace和冒号以外的任何字符[^[:space:::]*
- 和
匹配wspace或EOL边界([[:space:]|$)
(|$)
吗?@PJProudhon不是吗?非常感谢@oguzismail。下面的派生(\s
替换了[:space:][/code>)似乎适用于所有这些示例:sed-E的/aa:[^\s:][*(\s |$)/”
它一般有效吗?@johnyutahh我不能说是。-E和\s都不可移植。大多数SED都有-E,但不能对\s这样说。如果您想要最大的可移植性,请使用sed's/aa:[^[:space:::]*\([[:space:]\\\\\\;$\)/”
;它应该适用于所有兼容POSIX的系统seds@JohnnyUtahh\s
和其他此类字符集在字符类中不起作用。。它将匹配\
和s
而不是空格。。。例如,echo'a\sb\cdssss12'| sed's/[\s]*//g'
将给出abcd12
在这种情况下不起作用:$echo'bb:33 cc:44 aa:22';sed-r's/aa:[^]+//g'
bb 33 cc:44 aa:22
。删除最后一个空格,它就会工作。。。但如果aa:22
不在行的末尾,则会留下额外的“双空格”。有办法解决这个问题吗?同样,对于[^]
(仅限空格),这可能不适用于制表符分隔的字符串。