仅匹配sed的单个数字

时间:2016-05-23 18:58:29

标签: regex linux bash sed

我必须使正则表达式匹配一位数。 它应匹配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 

3 个答案:

答案 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仅支持BREERE,但您可以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