首页 > 解决方案 > 带有可选小数和反向引用的 sed 数字

问题描述

我有这样的简单输入:

11111(n)
222222(p)
33333333(:)

我可以使用 sed 反向引用将括号与这样的数字交换:

sed -e 's/\([[:digit:]]*\)\((.*)\)/\2 \1/' file

产生

(n) 11111
(p) 222222
(:) 33333333

这个很酷 !

但是对于潜在的十进制数字,事情变得更加困难,就像这样

11111(n)
11111.111(n)
2222222.22(p)
33.3333333(:)

我尝试了很多命令,比如

sed -e 's/\([[:digit:]]*(\.[[:digit:]]*?)\)\((.*)\)/\2 \1/' file
sed -e 's/\([[:digit:]]*\.?[[:digit:]]*?)\)\((.*)\)/\2 \1/' file
sed -e 's/\([[:digit:]]*\.*[[:digit:]]*)\)\((.*)\)/\2 \1/' file
sed -e 's/\([[:digit:]]*.*[[:digit:]]*)\)\((.*)\)/\2 \1/' file

所需的输出:

(n) 11111
(n) 11111.111
(p) 2222222.22
(:) 33.3333333

请注意,数字可以是任意长度(1 到 n 位),小数点 (.) 和小数位是可选的。

此外,sed似乎没有\d速记,正如stackexchange中所指出的那样

标签: regexsed

解决方案


你可以使用这个sed

sed -E 's/^([.[:digit:]]+)(\([^)]*\))/\2 \1/g' file

(n) 11111
(n) 11111.111
(p) 2222222.22
(:) 33.3333333

这里[.[:digit:]]+将匹配任何数字或点字符的 1+。


推荐阅读