简单的正则表达式难倒我:找到除特定模式以外的所有内容
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。希望将来有人会看到并能够使用它。
您可以使用形式为
的正则表达式
[^_]+$
测试
$ 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
第二个下划线后的所有内容:
^[^_]*_[^_]*_\(.*\)
我已经在互联网和正则表达式上搜索了大约一个半小时,现在试图让一个非常简单的正则表达式工作。我有一个脚本迭代超过 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。希望将来有人会看到并能够使用它。
您可以使用形式为
的正则表达式[^_]+$
测试
$ 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
第二个下划线后的所有内容:
^[^_]*_[^_]*_\(.*\)