Wan*_*rer 2 sed regular-expression
所以,我有 50 多个单词,我必须匹配其中的数字。这些数字可以是 3 位或 4 位数字。我想我尝试了所有方法,但似乎没有任何效果(我需要记住数字作为模式)。我的尝试:
'/\(.*\)\([0-9][0-9]?[0-9][0-9]\)\(.*\)/'
'/\(.*\)\([0-9]\{3,4\}\)\(.*\)/'
'/\(.*\)\(([0-9][0-9][0-9][0-9]|[0-9][0-9][0-9])\)\(.*\)/'
...
Run Code Online (Sandbox Code Playgroud)
它总是只匹配 3 个数字或整个单词。
输入:
1844-PAL.Bak
IMG_1959.bak
ZER_1940.BAK
PEN225.bak
word-1943.BAK
Run Code Online (Sandbox Code Playgroud)
需要记住的模式:
1844
1959
1940
225
1943
Run Code Online (Sandbox Code Playgroud)
有很多方法可以做到这一点。以下命令假设每个输入行只能有一个数字。我正在使用此文件作为测试:
1844-PAL.Bak
IMG_1959.bak
ZER_1940.BAK
PEN225.bak
word-1943.BAK
Run Code Online (Sandbox Code Playgroud)
sed
$ sed -r 's/([^0-9]*)([0-9]*)([^0-9]*)/1:"\1", 2:"\2", 3:"\3"/' file
1:"", 2:"1844", 3:"-PAL.Bak "
1:"IMG_", 2:"1959", 3:"bak "
1:"ZER_", 2:"1940", 3:"BAK "
1:"PEN", 2:"225", 3:"bak"
1:"word-", 2:"1943", 3:"BAK"
Run Code Online (Sandbox Code Playgroud)perl
$ perl -lpe 's/([^\d]*)(\d*)([^\d])/1:"$1", 2:"$2", 3:"$3"/' file
1:"", 2:"1844", 3:"-"PAL.Bak
1:"IMG_", 2:"1959", 3:"."bak
1:"ZER_", 2:"1940", 3:"."BAK
1:"PEN", 2:"225", 3:"."bak
1:"word-", 2:"1943", 3:"."BAK
Run Code Online (Sandbox Code Playgroud)grep
$ grep -oP '\d+' file
1844
1959
1940
225
1943
Run Code Online (Sandbox Code Playgroud)如果每行只有一个感兴趣的模式,则可以简化为
$ sed -r 's/[^0-9]*([0-9]*).*/Matched: \1/' file
Matched: 1844
Matched: 1959
Matched: 1940
Matched: 225
Matched: 1943
Run Code Online (Sandbox Code Playgroud)
或者
$ perl -lpe 's/.*?(\d+).*/Matched $1/' file
Matched 1844
Matched 1959
Matched 1940
Matched 225
Matched 1943
Run Code Online (Sandbox Code Playgroud)
一般来说,对于正则表达式,少即是多。您应该始终尝试使用必要的最简单的正则表达式。如果您不想捕获或匹配非数字字符,请将它们排除在正则表达式之外。
| 归档时间: |
|
| 查看次数: |
34954 次 |
| 最近记录: |