3

我是 bash 新手,很难弄清楚这一点。

使用sed,任何人都可以帮助我在给定文件中仅查找偶数吗?

我想出了如何使用以下方法找到从 [0,2,4,6,8] 开始的所有数字:

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

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

我很难找到匹配的数字是否以 [0,2,4,6,8] 结尾,因为它是肯定的。

那么有人可以帮我解决这个问题吗?

4

4 回答 4

1

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

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

-r启用扩展的正则表达式,*?使其不贪婪,并对/g文件中的所有行进行全局替换。

于 2012-12-07T08:27:30.917 回答
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, not的用例sed,因为您进行过滤而不是编辑。一切都变得更容易GNU grep,正如你可以做的那样

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

只需附加> even到命令以使其写入文件even

于 2012-12-07T09:27:52.390 回答
1
$ cat file
1
2
3
498
57
12345678
$ awk '$0%2' file
1
3
57
$ awk '!($0%2)' file
2
498
12345678
于 2012-12-07T14:14:21.513 回答
0

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

于 2012-12-07T08:26:46.730 回答