Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何用正则表达式模式匹配具有固定前缀的可变长度单词?_Regex_Sed_Key Value - Fatal编程技术网

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
  • -E
    用于ERE支持
  • [^[:space:::]*
    匹配0+除wspace和冒号以外的任何字符
  • ([[:space:]|$)
    匹配wspace或EOL边界

需要
(|$)
吗?@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
不在行的末尾,则会留下额外的“双空格”。有办法解决这个问题吗?同样,对于
[^]
(仅限空格),这可能不适用于制表符分隔的字符串。