我试图在其中找到一个包含两位数字的行.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位或更多位数的行。
答案 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位数字的行