我必须使正则表达式匹配一位数。 它应匹配7和a7b但不匹配77。 我做了这个,但它似乎不适用于sed。
(?<![\d])(?<![\S])[1](?![^\s.,?!])(?!^[\d])
(?<![\d])(?<!^[\a-z])\d(?![^a-z])(?!^[\d])
我做错了什么?
编辑:
我需要用
之类的东西替换一位数字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
答案 0 :(得分:0)
<强>输入强>
a77
a7b
2ab
882
9
abcfg9
9fg
ab9
<强>脚本强>
sed -En '/^[^[:digit:]]*[[:digit:]]{1}[^[:digit:]]*$/p' filename
<强>输出强>
a7b
2ab
9
abcfg9
9fg
ab9
答案 1 :(得分:0)
sed仅支持BRE和ERE,但您可以grep -P
启用PCRE:
% printf 'a77\na7b\n2ab\n82\n' | grep -P '(?<!\d)\d(?!\d)'
a7b
2ab
grep将显示打印匹配的行,但可以选择仅打印匹配:
% printf 'a77\na7b\n2ab\n82\n' | grep -oP '(?<!\d)\d(?!\d)'
7
2
答案 2 :(得分:0)
要在问题的示例中执行的操作是:
$ 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