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

时间:2015-01-05 18:23:08

标签: regex sed

我已经在互联网和regexpal上搜索大约一个半小时,现在试图让一个非常简单的正则表达式工作。我有一个脚本,它遍历超过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]+_(.*)/\1/' <<< $replace)

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

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

它遍历我的所有.tcl文件,剥离扩展并保存该值,然后从该文件中删除主题前缀,最后在文件中使用这两个值进行查找/替换。希望未来的某个人能够看到这一点并能够使用它。

5 个答案:

答案 0 :(得分:2)

您可以使用

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

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]+_(.*)/\1/' inputFile
foo_bar
string_name
blah_blah
hip_hip
hooray
they_can_be_any_length_and_most_but_not_all_have_underscores

答案 1 :(得分:2)

您可以使用此sed

sed 's/^5_[0-9]*_[[:alnum:]]*_\{0,1\}\(.*\)$/\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:]]+_?(.*)$/\1/' file
bar
name
blah
hip

can_be_any_length_and_most_but_not_all_have_underscores

答案 2 :(得分:2)

考虑到问题,&#34;我希望在最后_&#34;之后匹配所有内容,我的理解是该问题要求使用字符串5_100_foo_bar并返回匹配{ {1}}。

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

foo_bar

我们首先匹配您指定的模式sed 's/5_[0-9]*_\(.*\)/\1/' example.txt 。然后,模式5_[0-9]*_将匹配任意数量的字符,并将其存储为\(.*\)

结果:

\1

答案 3 :(得分:2)

如果您的输入只是&#34;字&#34;你正试图解决这个问题。

$ 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

答案 4 :(得分:1)

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

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