Regex 简单的正则表达式难住了我:除了特定的模式之外,什么都可以找到

Regex 简单的正则表达式难住了我:除了特定的模式之外,什么都可以找到,regex,sed,Regex,Sed,我已经在互联网和regexpal上搜索了大约一个半小时,现在试图让一个非常简单的regex工作起来。我有一个脚本,它可以迭代100多个字符串,所有字符串都以:5\uuuu开头,我想匹配第二个\uuu之后的所有内容,因此我创建了非常简单的正则表达式: 5[0-9]*. 我唯一的问题是把它颠倒过来。我试过用lookaheads,但我想我把语法搞乱了,我已经不知所措了 谢谢 编辑:以下是一些示例字符串,请参见: 5_100_foo_bar 5_01_string_name 5_99_blah_bla

我已经在互联网和regexpal上搜索了大约一个半小时,现在试图让一个非常简单的regex工作起来。我有一个脚本,它可以迭代100多个字符串,所有字符串都以:
5\uuuu
开头,我想匹配第二个
\uuu
之后的所有内容,因此我创建了非常简单的正则表达式:

5[0-9]*.

我唯一的问题是把它颠倒过来。我试过用lookaheads,但我想我把语法搞乱了,我已经不知所措了

谢谢


编辑:以下是一些示例字符串,请参见:

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
!/bin/bash
对于*.tcl;do中的fl
#删除扩展
replace=${fl:0:${#fl}-4}
#删除前缀

find=$(sed-r's/5_u[0-9]+(+.*)/\1/'您可以使用以下形式的正则表达式

[^_]+$

测试

$ 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
编辑

$ 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

您可以使用此
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
考虑到问题“我想匹配最后一个
\uuu
之后的所有内容”,我的理解是该问题要求获取字符串
5\u 100\u foo\u bar
,并返回匹配的
foo\u bar

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

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

结果:

foo_bar
string_name
blah_blah
hip_hip
hooray
they_can_be_any_length_and_most_but_not_all_have_underscores
如果您的输入只是您试图处理的“单词”,那么这将起作用

$ 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

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

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

第一位后面的字符串通常也包含下划线。很抱歉,我没有包含足够的信息。我用了几个例子更新了我的帖子。@Joshua我编辑了我的anwer。希望它对你有用它有用!我忘了提到我使用的是字符串而不是文件,但是
bar=$(sed-r's/5\u0-9]+\u(+.*)/\1/“我太马虎了,我脑子里说的没错。我指的是第二个下划线(前缀中的“最后一个”)之后的所有内容