我有一个文件,其列表如下所示:
$ABC01
$ABC02
$ABC03
$ABC04
$ABC05
我想要所有那些不是$ABC02. 这是代码的一部分,在此步骤之前,我将字符串 ABC 记录在一个变量中,将数字 02 记录在另一个变量中。我基本上想要所有以 ABC 开头的条目,并以除02.
我试过这个,但它不工作:
/^\$ABC[^02]$/
在这种情况下要使用的正确正则表达式是什么?
您的正则表达式当前所做的是找到“$ABC”后跟一位数字。您需要将其拆分[^02]为匹配的 2 个字符,如下所示。
/^\$ABC[^0][^2]$/
...但是...这也将匹配末尾有非数字的字符串。因此,与其使用你不想找到的东西,不如放入你想要找到的东西。
/^\$ABC([1-9][0-9]|0[013-9])$/
这将查找 1 到 9 后跟任何数字或 0 后跟除 2 之外的任何数字。如果您不想要捕获组,可以将(...)替换为。(?:...)
请注意,这[^02]是一个否定字符类,它匹配除0and之外的任何字符2,并且它不必是数字,顺便说一句。
您可以使用(?!02$)负前瞻C来避免匹配以 结尾02但以任何其他数字(包括0210等)结尾的字符串:
/^\$ABC(?!02$)[0-9]+$/
如果您不想匹配C*start with 之后的数字,请从前瞻02中删除:$
/^\$ABC(?!02)[0-9]+$/
查看另一个正则表达式演示。
看起来您只需要从文件中删除一个特定的行。$ABC与其编写一个花哨的正则表达式模式来匹配除 之外的任何内容,不如02简单地使用该语言来丢弃给定的字符串。就像是print if not /\$ABC02/
在 Perl 单行命令中,这会检查整行是否与值匹配,如果匹配则忽略它
perl -ne 'print unless /^\$ABC02$/' myfile