考虑以下几行
842567831752rajfkglxfgk kerigjeiofjgoe jergjerio4523789573489
genfjkgnerijio 234578934897 jgioefjgio shfhuwehjdfu7890345289103
在linux中如何获得上面几行中789之后的四位数字
答案1
使用 grep
grep -Po '(?<=789).{4}'
解释
grep -P
: 在 Perl 模式下使用 grep-o
: 只返回匹配的部分(?<=789)
: 向后看。这应该出现在“匹配”部分之前。.{4}
:匹配四个字符(在lookbehind之后)。这就是将被返回的内容。
或者使用 sed
sed -r 's/.*789(.{4}).*/\1/'
789
这假设队列中只有一个。
解释
sed -r
:在扩展正则表达式模式下使用 sed 以获得更好的可读性。s/foo/bar/
: 用foo
。。。来代替bar
。.*789(.{4}).*
:匹配行的开头.*
,,789
然后四个字符(.{4})
,同时捕获它们()
,然后是该行的其余部分.*
。这与整条线完全匹配。\1
:用上面第一个匹配的模式替换整行。
或者使用 awk
awk '{if (match($0,/789(.{4})/,m)) print m[1]}'
789
这假设队列中只有一个。在 awk 中可能有六种方法可以做到这一点。
解释
match($0,/789(.{4})/,m)
:在整行中查找$0
正则表达式789(.{4})
,并捕获后面的四个字符789
。print m[1]
:打印第一个捕获组。
只是数字
如果您只想获取数字,那么您可以使用如下所示的内容:
grep -Po '(?<=789).*' | sed -r 's/^[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9]).*/\1\2\3\4/'
请注意,该策略假设有是后四位数字789
。
解释
grep -Po '(?<=789).*'
:与上面类似,但是输出全部后的字符789
。| sed -r 's/foo/bar/'
:使用扩展正则表达式模式将其通过管道传输到 sed 并替换foo
为 `bar.^[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9]).*
:匹配行的开头^
,所有非数字字符[^0-9]*
,然后捕获数字([0-9])
。再重复此操作三次,然后匹配该行的其余部分.*
。\1\2\3\4
:用捕获组替换整行,即接下来的四位数字。
(或者,您可以使用 perl 的非贪婪正则表达式来简化 sed 表达式。perl -pe 's/.*?([0-9]).*?([0-9]).*?([0-9]).*?([0-9]).*/\1\2\3\4/'
)
答案2
$ echo "842567831752rajfkglxfgk kerigjeiofjgoe jergjerio4523789573489" | grep -oP '789\K....'
5734
$ echo "genfjkgnerijio 234578934897 jgioefjgio shfhuwehjdfu7890345289103" | grep -oP '789\K....'
3489
0345
答案3
AWK
找到所有 4 位数字之后的项目的解决方案789
:
awk -F'789' '{ for(i=2;i<=NF;i++) printf "%s%s",(i==2?"":" "),substr($i,1,4); print ""}' file
-F'789'
-789
视为字段分隔符
输出(所有找到的项目每行):
5734
3489 0345
----------
或者简单地将每个项目打印在单独的行上:
awk -F'789' '{ for(i=2;i<=NF;i++) print substr($i,1,4) }' file
输出:
5734
3489
0345