简单的正则表达式难倒我:找到除特定模式以外的所有内容

Simple regex stumping me: Find everything but specific pattern

我已经在互联网和正则表达式上搜索了大约一个半小时,现在试图让一个非常简单的正则表达式工作。我有一个脚本迭代超过 100 个字符串,所有字符串都以:5_<1-109>_<text> 开头,我想匹配第二个 _ 之后的所有内容,所以我创建了非常简单的正则表达式:

5_[0-9]*_

我遇到的唯一问题是反转它。我已经尝试过前瞻,但我认为我以某种方式弄乱了语法并且我无能为力。

谢谢


编辑:根据要求,这里有一些示例字符串:

5_100_foo_bar
5_01_string_name
5_99_blah_blah
5_109_hip_hip
5_16_hooray
5_05_they_can_be_any_length_and_most_but_not_all_have_underscores

Edit2:感谢所有回复,它们看起来都很有效,我希望我可以选择多个答案:(


对于那些感兴趣的人,这里是这篇文章的完整脚本:

#!/bin/bash
     for fl in *.tcl; do

     #Remove extention
     replace=${fl:0:${#fl}-4}

     #Remove prefix
     find=$(sed -r 's/5_[0-9]+_(.*)//' <<< $replace)

     echo Filename: $fl
     echo REPLACESTRING: $replace
     echo FINDSTRING: $find

     sed -i s/$find/$replace/g $fl
     done

它遍历我所有的 .tcl 文件,去掉扩展名并保存那个值,然后去掉那个文件的主题前缀,最后在文件中用这两个值做一个 find/replace。希望将来有人会看到并能够使用它。

您可以使用形式为

的正则表达式
[^_]+$

Rgex Demo

测试

$ echo 5_100_abc | sed -r 's/[^_]+$/xxx/'
5_100_xxx

$ echo 5_2_abc | sed -r 's/[^_]+$//'
5_2_

编辑

$ sed -r 's/5_[0-9]+_(.*)//' inputFile
foo_bar
string_name
blah_blah
hip_hip
hooray
they_can_be_any_length_and_most_but_not_all_have_underscores

你可以使用这个sed:

sed 's/^5_[0-9]*_[[:alnum:]]*_\{0,1\}\(.*\)$//' file
bar
name
blah
hip

can_be_any_length_and_most_but_not_all_have_underscores

或使用sed -r:

sed -r 's/^5_[0-9]+_[[:alnum:]]+_?(.*)$//' file
bar
name
blah
hip

can_be_any_length_and_most_but_not_all_have_underscores

鉴于问题 "I want to match everything after the last _",我的理解是问题要求采用字符串 5_100_foo_bar 和 return 匹配 foo_bar.

在这种情况下,可以使用命令

sed 's/5_[0-9]*_\(.*\)//' example.txt

我们首先匹配您指定的模式,5_[0-9]*_。然后,模式 \(.*\) 将匹配任意数量的字符并将它们存储为 </code>.</p> <p>结果:</p> <pre><code>foo_bar string_name blah_blah hip_hip hooray they_can_be_any_length_and_most_but_not_all_have_underscores

如果您的输入只是您要处理的 "word" 那么这将起作用。

$ cut -d_ -f3- file
foo_bar
string_name
blah_blah
hip_hip
hooray
they_can_be_any_length_and_most_but_not_all_have_underscores

第二个下划线后的所有内容:

^[^_]*_[^_]*_\(.*\)