使用'sed‘,我想用1234567890替换任何10位序列
这是可行的,但不太优雅。
echo "code=1111111111" | sed 's/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/1234567890/'
这不管用
echo "code=1111111111" | sed 's/[0-9]{10}/1234567890/'
结果
code=1111111111
有人能提出一个简单优雅的解决方案,使用'sed‘吗?
发布于 2023-05-11 10:05:21
sed
默认使用基本正则表达式,这意味着{10}
将被视为纯文本。
您可以验证这一点:
echo "code=1{10}" | sed 's/[0-9]{10}/1234567890/'
将产生以下结果:
1234567890
在你的情况下,你需要:
-E
选项指定要使用扩展正则表达式。{
和}
:\{10\}
。echo "code=1111111111" | sed -E 's/[0-9]{10}/1234567890/'
echo "code=1111111111" | sed 's/[0-9]\{10\}/1234567890/'
发布于 2023-05-11 14:13:57
使用ERE
regex风味:
$ echo "code=1111111111" | sed -E 's/[0-9]{10}/1234567890/'
code=1234567890
发布于 2023-05-11 15:35:35
如果您想用每行1234567890替换10位(而不是更多的ASCII十进制数字)的第一个序列,那么应该是:
sed -E 's/(^|[^0123456789])[0123456789]{10}([^0123456789]|$)/\112345678900\2/'
也就是说,只替换10位数字(使用[0123456789]
而不是[0-9]
,因为后者可以匹配比仅仅0123456789多个字符,这取决于sed
实现和/或区域设置),前面是行的开头或非数字,后面是非数字或行尾。
这样仍然可以将1112223334.6
替换为1234567890.6
,或者将1.0000000000e-2
替换为1.1234567890e-2
,或者将0xff0777888999ee
替换为0xff1234567890ee
,因此您可能需要根据您想要的内容和在输入中找到的内容进行调整。
若要替换所有10位(而不是更多位数)的序列,可以是:
sed -E 's/[0123456789]+/\
&\
/g; s/\n[0123456789]{10}\n/123456789/g;s/\n//g'
或者您可以切换到perl
:
perl -pe 's/(?<!\d)\d{10}(?!\d)/1234567890/g'
使用负的查找操作符来检查10位小数位的顺序,既不前面也不后面跟着另一个数字。
https://unix.stackexchange.com/questions/745581
复制相似问题