只匹配个位数sed

  • 本文关键字:sed regex linux bash sed
  • 更新时间 :
  • 英文 :


我必须制作一个正则表达式来只匹配一个数字。它应该匹配7和a7b,但不匹配77。我做了这个,但在sed中似乎不起作用。

(?<![d])(?<![S])[1](?![^s.,?!])(?!^[d]) 
(?<![d])(?<!^[a-z])d(?![^a-z])(?!^[d])

我做错了什么?

编辑:

我只需要用之类的东西替换1位数

sed 's/regex/@/g' file //regex to match "1"

文件内容

1 2 3 4 5 11 1
agdse1tg1xw 
6 97 45 12 

应成为

@ 2 3 4 5 11 @ 
agdse@tg@xw 
6 97 45 12 

输入

a77
a7b
2ab
882
9
abcfg9
9fg
ab9

脚本

sed -En '/^[^[:digit:]]*[[:digit:]]{1}[^[:digit:]]*$/p' filename

输出

a7b
2ab
9
abcfg9
9fg
ab9

要完成问题中示例中显示的操作,请执行以下操作:

$ sed -r 's/(^|[^0-9])1([^0-9]|$)/1@2/g' file
@ 2 3 4 5 11 @
agdse@tg@xw
6 97 45 12

但这只是因为你的数据中没有1 1。如果你这样做了,你需要2次通过:

$ echo '1 1' | sed -r 's/(^|[^0-9])[0-9]([^0-9]|$)/1@2/g'
@ 1
$ echo '1 1' | sed -r 's/(^|[^0-9])[0-9]([^0-9]|$)/1@2/g; s/(^|[^0-9])[0-9]([^0-9]|$)/1@2/g'
@ @

如果你想对任何一个数字这样做,那就是:

$ sed -r 's/(^|[^0-9])[0-9]([^0-9]|$)/1@2/g; s/(^|[^0-9])[0-9]([^0-9]|$)/1@2/g' file
@ @ @ @ @ 11 @
agdse@tg@xw
@ 97 45 12

sed仅支持BRE和ERE,但您可以使用grep -P:启用PCRE

% printf 'a77na7bn2abn82n' | grep -P '(?<!d)d(?!d)'
a7b
2ab

grep将打印匹配的行,但可以选择只打印匹配的:

% printf 'a77na7bn2abn82n' | grep -oP '(?<!d)d(?!d)'
7
2

相关内容

  • 没有找到相关文章

最新更新