如何正则表达式模式匹配具有固定前缀的可变长度单词?
How to regex-pattern-match a variable-length word with a fixed prefix?
总结
一个正则表达式模式如何匹配我认为可能 (?) 最好描述为 "variable-length word with a fixed prefix"?
详情
下面的示例尝试删除 aa:22
。 None 他们工作。
所有命令的首选输出是bb:33 cc:44
。当然,这些命令并非旨在删除前导或额外的 spaces.
我使用 perl -pe
(在第一个命令中未成功)尝试使可变长度模式匹配为 "non greedy."
在这些例子中,aa:
是前缀(可以认为是键值对中的"key"),22
是变量内容,变量-长度值;即,它可以是 aa:2vED/3rD@&x3J{ZB334}A
(在此语法中,任何包含非白色 space 字符而不是 :
的字符串),但它始终在右侧与白色 [= 接壤49=](space 和制表符是唯一的白色 space 字符,是吗?)或行尾。
更进一步:单词序列(键值对)可以以任何顺序找到。因此,基于 awk
的固定列匹配可能不起作用。
我正在寻找一个优雅、简单的解决方案。我读过许多 Stack Overflow 的答案,它们的正则表达式看起来非常长且复杂到难以理解的程度。显然我没有受过足够的正则表达式教育。
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
和所有其他字符直到第一个 space。
$ 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
-E
用于 ERE 支持,
[^[:space:]:]*
匹配 0+ 除 wspace 和冒号外的任何字符,
- 和
([[:space:]]|$)
匹配 wspace 或 EOL 边界。
总结
一个正则表达式模式如何匹配我认为可能 (?) 最好描述为 "variable-length word with a fixed prefix"?
详情
下面的示例尝试删除 aa:22
。 None 他们工作。
所有命令的首选输出是bb:33 cc:44
。当然,这些命令并非旨在删除前导或额外的 spaces.
我使用 perl -pe
(在第一个命令中未成功)尝试使可变长度模式匹配为 "non greedy."
在这些例子中,aa:
是前缀(可以认为是键值对中的"key"),22
是变量内容,变量-长度值;即,它可以是 aa:2vED/3rD@&x3J{ZB334}A
(在此语法中,任何包含非白色 space 字符而不是 :
的字符串),但它始终在右侧与白色 [= 接壤49=](space 和制表符是唯一的白色 space 字符,是吗?)或行尾。
更进一步:单词序列(键值对)可以以任何顺序找到。因此,基于 awk
的固定列匹配可能不起作用。
我正在寻找一个优雅、简单的解决方案。我读过许多 Stack Overflow 的答案,它们的正则表达式看起来非常长且复杂到难以理解的程度。显然我没有受过足够的正则表达式教育。
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
和所有其他字符直到第一个 space。
$ 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
-E
用于 ERE 支持,[^[:space:]:]*
匹配 0+ 除 wspace 和冒号外的任何字符,- 和
([[:space:]]|$)
匹配 wspace 或 EOL 边界。