通过Sed搜索文件行中的两位数字

时间:2014-03-07 05:42:45

标签: unix sed

我试图在其中找到一个包含两位数字的行.Eg:

test.txt

uuLinuxxx
Linux 2011
2011 Linux RedHat
Linux RedHat
2011
2013  2014
2010
/usr/bin
2
Ubuntu 20 world

期望OP:Ubuntu 20世界

我正在使用

sed -n '/[0-9]\{2\}/p' test.txt

但问题是它正在打印所有包含2位或更多位数的行。

4 个答案:

答案 0 :(得分:5)

这可能适合你(GNU sed):

sed -n '/\b[0-9]\{2\}\b/p' file

或:

sed -nr '/\b[0-9]{2}\b/p' file

或:

sed -r '\b[0-9]{2}\b/!d' file

或:

sed '/\<[0-9]\{2\}\>/!d' file

答案 1 :(得分:2)

使用-w开关匹配单词(在您的情况下为数字)。

grep -w '[0-9][0-9]' file

来自man页面:

-w, --word-regexp
     Select only those lines containing matches that form whole words.  
     The test is that the matching substring must either be at the beginning of the
     line,  or preceded by a non-word constituent character. Similarly, it must be either 
     at the end of the line or followed by a non-word constituent character. Word-
     constituent characters are letters, digits, and the underscore.

答案 2 :(得分:1)

问题是你的正则表达式正在寻找两个连续的数字,其中存在数字20(好)和99999999999999999999(不太好)。

你需要的是一个正则表达式,确保你找到的两边都没有数字,例如:

[^0-9][0-9]{2}[^0-9]  # non-digit the two digits then non-digit

此外,您需要捕获两个数字位于行的开头或结尾(或行上唯一的内容)的位置。因此,您需要使用或者|或单独的-e参数分隔的多个正则表达式:

^[0-9]{2}[^0-9]       # at start of line
[^0-9][0-9]{2}[^0-9]  # in middle of line
[^0-9][0-9]{2}$       # at end of line
^[0-9]{2}[^0-9]$      # only thing on line

您可能还想为工作选择更好的工具,例如grep。使用略微修改的输入文件:

uuLinuxxx
Linux 2011
2011 Linux RedHat
Linux RedHat
2011
2013  2014
2010
/usr/bin
2
Ubuntu 20 world
99 at the start
at the end: 99
88

以下命令(为便于阅读而拆分):

grep -E -e '[^0-9][0-9]{2}[^0-9]'
        -e '^[0-9]{2}[^0-9]'
        -e '[^0-9][0-9]{2}$'
        -e '^[0-9]{2}[^0-9]$' test.txt

为您提供所需内容:

Ubuntu 20 world
99 at the start
at the end: 99
88

当然,如果你有GNU grep及其基于Perl的正则表达式,并且你在“字”之后是两位数字,那么这就变得容易了:

grep -P '\b\d{2}\b' test.txt

但是,如果您可以保证字数限制,以下内容也适用:

grep -Ew '[0-9]{2}' test.txt

答案 3 :(得分:1)

sed -n 's/.*/²&²/;/[^0-9][0-9]\{2\}[^0-9]/ s/.\(.*\)./\1/p' YourFile

使用临时边框仅允许1次检查提取

内仅2位数字的行