使用“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”的简单优雅的解决方案?
sed
默认情况下使用基本正则表达式,这意味着{10}
将被视为纯文本。您可以验证这一点:
这将输出:
在您的情况下,您需要:
-E
选项指定您要使用扩展正则表达式。{
并}
像这样:\{10\}
.使用
ERE
正则表达式风格:其他人已经指出您正在尝试将 POSIX 扩展正则表达式与 一起使用
sed
,它默认理解 POSIX基本正则表达式。如果您使用该-E
选项,该工具的一些(大多数)实现可以理解扩展的正则表达式,但您也可以通过更改{10}
为\{10\}
.但是,如果您想确保替换正确的十位数字,您可能应该避免匹配较长的数字和出现在输入中其他位置的数字。
=
在不了解更多有关输入的情况下,我会通过匹配字符和行尾来限制匹配:这样可以避免匹配较长的数字和不出现在 a
=
和行尾之间的十位数字。如果您知道您需要更改变量的值
code
(或其他code
变量),也匹配该名称(在这里,我还假设名称从行的开头开始,并且我正在捕获名称并替换它\1
在替换中使用以减少重复):如果你想在每行上用 1234567890 替换第一个序列 10而不是更多的ASCII 十进制数字,那可能应该是:
那就是仅替换 10 位数字(使用
[0123456789]
而不是因为[0-9]
后者可以匹配更多的字符,而不仅仅是 0123456789,具体取决于实现sed
和/或语言环境),前面是行的开头或非数字,然后是非- 数字或行尾。那仍然会替换
1112223334.6
with1234567890.6
或1.0000000000e-2
with1.1234567890e-2
或0xff0777888999ee
with0xff1234567890ee
因此您可能需要根据您想要的内容以及您在输入中找到的内容进行调整。要替换所有10 个而不是更多数字的序列,可以是:
或者你可以切换到
perl
:使用否定环视运算符检查 10 个十进制数字的序列之前或之后都没有其他数字。
谢谢@Kamil Maciorowski
这很好用