使用 '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' 的简单优雅的解决方案?
答案1
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/'
答案2
其他人已经指出您正在尝试使用 POSIX 扩展正则表达式sed
,默认情况下它理解 POSIX基本的常用表达。如果您使用该选项,该工具的一些(大多数)实现可以理解扩展正则表达式,但您也可以通过更改为 来-E
将表达式更改为基本表达式。{10}
\{10\}
但是,如果您想确保更换正确的十位数字,您可能应该避免匹配更长的数字以及输入中其他位置出现的数字。
=
在不了解有关输入的更多信息的情况下,我将通过匹配字符和行尾来限制匹配:
sed 's/=[0-9]\{10\}$/=1234567890/'
这可以避免匹配较长的数字以及不在 a=
和行尾之间出现的十位数字。
如果您知道需要更改code
变量的值(或其他code
值),也请匹配该名称(在这里,我还假设该名称从行的开头开始,并且我正在捕获该名称并替换它\1
替换中使用以减少重复):
sed 's/^\(code\)=[0-9]\{10\}$/\1=1234567890/'
答案3
使用ERE
正则表达式风格:
$ echo "code=1111111111" | sed -E 's/[0-9]{10}/1234567890/'
code=1234567890
答案4
如果你想替换第一个序列10且仅此而已每行 1234567890 的 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 个十进制数字的序列前面或后面是否没有其他数字。