我是 bash 新手,很难弄清楚这一点。
使用sed
,任何人都可以帮助我在给定文件中仅查找偶数吗?
我想出了如何使用以下方法找到从 [0,2,4,6,8] 开始的所有数字:
sed -n 's/^[0-9]*[02468] /&/w even' <file
但这并不能保证这个数字是肯定的。
我很难找到匹配的数字是否以 [0,2,4,6,8] 结尾,因为它是肯定的。
那么有人可以帮我解决这个问题吗?
我是 bash 新手,很难弄清楚这一点。
使用sed
,任何人都可以帮助我在给定文件中仅查找偶数吗?
我想出了如何使用以下方法找到从 [0,2,4,6,8] 开始的所有数字:
sed -n 's/^[0-9]*[02468] /&/w even' <file
但这并不能保证这个数字是肯定的。
我很难找到匹配的数字是否以 [0,2,4,6,8] 结尾,因为它是肯定的。
那么有人可以帮我解决这个问题吗?
您的正则表达式看起来有点奇怪,我不确定您想做什么,但这应该会有所帮助:
sed -r -n 's/^[0-9]*?[02468] /even/g'
-r
启用扩展的正则表达式,*?
使其不贪婪,并对/g
文件中的所有行进行全局替换。
假设所有偶数后面都有一个空格并且它们都在行的开头,您的命令应该可以正常工作:
$ 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
。
$ cat file
1
2
3
498
57
12345678
$ awk '$0%2' file
1
3
57
$ awk '!($0%2)' file
2
498
12345678
为什么找不到以 [02468] 结尾的数字?