我必须制作一个正则表达式来只匹配一个数字。它应该匹配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