SED:如何使用sed在给定文件中仅查找偶数

时间:2012-12-07 08:21:50

标签: sed pattern-matching

我是bash的新手,并且很难搞清楚这一点。

使用sed,是否有人可以帮我查找给定文件中的偶数?

我想出了如何使用这个来找到从[0,2,4,6,8]开始的所有数字:

sed -n 's/^[0-9]*[02468] /&/w even' <file 

但这并不能保证这个数字是肯定的。

我很难找到匹配的号码是否以[0,2,4,6,8]结尾,因为它确实是偶然的。

任何人都可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

你的正则表达式看起来有点奇怪,我不确定你想做什么,但这应该有所帮助:

sed -r -n 's/^[0-9]*?[02468] /even/g'

-r启用扩展正则表达式,*?使其变得非贪婪,/g为文件中的所有行全局执行替换。

答案 1 :(得分:1)

假设所有偶数后面都有一个空格并且它们都在行的开头,那么你的命令应该可以正常工作:

$ echo 'foo 
1231 
2220 
1254 ' | sed -n '/[0-9]*[02468] /p'
2220 
1254 

另请注意,由于您实际上没有进行替换,因此您不需要s命令。使用地址(模式)说明符和w命令(就像我上面用p命令所做的那样)。

要确保偶数位是最后一位,但不一定是空格,您可以执行类似

的操作
$ echo 'foo
1231
2220
1254 ' | sed -n '/[0-9]*[02468]\($\|[^0-9]\)/p'
2220
1254 

实际上,您的案例看起来更像是grep的用例,而不是sed,因为您进行过滤而不是编辑。使用GNU grep可以轻松完成任务,

$ echo 'foo
1231
2220
1254 ' | grep -P '\d*[02468](?!\d)'
2220
1254 

只需将> even附加到命令即可将其写入文件even

答案 2 :(得分:1)

$ cat file
1
2
3
498
57
12345678
$ awk '$0%2' file
1
3
57
$ awk '!($0%2)' file
2
498
12345678

答案 3 :(得分:0)

为什么不找到以[02468]结尾的数字?