打印以偶数开头的行

3

我有以下输入:

10
12    a
12 a
14a

以下命令:
sed -rn '/^[0-9]*[02468]\s/p'

(或者等效的grep命令)返回

12    a   
12 a

只返回10而不是10后面的EOL,因为10后面有一个EOL。另一方面,如果我去掉\s,也会返回14a,这不是一个数字。

谢谢!


你试过我的解决方案了吗?如果有效,请接受答案并点赞! - JRG
2个回答

1
使用给定的数据,以下是可以帮助您获得期望结果的命令。
搜索和替换:
sed -rn '/^[0-9]*[02468] |^[0-9]*[02468]$|^[0-9]*[02468]\t/p' n.txt

sed -rn 's/^[0-9]*[02468] |^[0-9]*[02468]$|^[0-9]*[02468]\t/blah/p' n.txt

搜索和替换使用awk:

search & replacement using awk:

awk -F" " '{if ($1 ~ /[02468]$/ && $1 % 2 == 0) print $1}' n.txt

awk -F" " '{if ($1 ~ /[02468]$/ && $1 % 2 == 0) print gensub($1,"blah", 1); else print $0;}' n.txt

注意: 第10行后面没有任何内容,第12行后面有空格,第16行后面有制表符。

示例运行

[/c]$ cat n.txt
10
11
12 a
13
14a
16      

[/c]$ sed -rn '/^[0-9]*[02468] |^[0-9]*[02468]$|^[0-9]*[02468]\t/p' n.txt
10
12 a
16

[/c]$ sed -rn 's/^[0-9]*[02468] |^[0-9]*[02468]$|^[0-9]*[02468]\t/blah/p' n.txt
blah
blaha
blah

示例运行(使用awk)

[/c]$ cat n.txt
10
11
12 a this is spaced line
13
14a
16      this is tab line

[/c]$ awk -F" " '{if ($1 ~ /[02468]$/ && $1 % 2 == 0) print $0}' n.txt
10
12 a this is spaced line
16      this is tab line

[/c]$ awk -F" " '{if ($1 ~ /[02468]$/ && $1 % 2 == 0) print gensub($1,"blah", 1); else print $0;}' n.txt
blah
11
blah a this is spaced line
13
14a
blah    this is tab line

很高兴能帮忙,我已经更新了我的答案,包括制表符的正则表达式。希望您能投票支持或接受我的答案。 - JRG
太好了!编辑了原始帖子以删除基本正则表达式所需的内容。有什么扩展的正则表达式解决方案吗? - Artur Fridman
我已经更新了解决方案,包括扩展正则表达式和不包括扩展正则表达式。 - JRG
FYI - 我已经撤销了我的扩展正则表达式,因为它们没有起作用,所以现在你可以仅使用 sed 进行搜索和替换。 - JRG
另一个好的解决方案!对于更复杂的模式,awk可能更好。顺便问一下,在你的代码中,为什么不用($或"\ s")替换(“”或$或"\ t")? - Artur Fridman
显示剩余10条评论

0

允许在文本结尾处而非其它字符处返回。

$ sed -rn '/^[0-9]*[02468](\s|$)/p' < data
10
12    a
12 a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接