我已经在互联网和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文件,剥离扩展并保存该值,然后从该文件中删除主题前缀,最后在文件中使用这两个值进行查找/替换。希望未来的某个人能够看到这一点并能够使用它。
答案 0 :(得分:2)
您可以使用
形式的正则表达式[^_]+$
<强>测试强>
$ 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)
第二个下划线之后的所有内容:
^[^_]*_[^_]*_\(.*\)