Sed:通过用零填充将一串数字扩展到一定数量的数字

sou*_*sse 7 sed

我目前正在尝试通过将其通过管道传输到 sed 来修改回显的字母数字字符串。我有兴趣修改的区域是一个数字块,我想通过在它前面插入适当数量的零来使 8 个字符长。例如:

输入:

loremipsumdolorsit2367amet

期望的输出:

loremipsumdolorsit00002367amet

用sed可以做到这一点吗?我正在处理的数字块少于 8 个字符。我不确定这篇文章是否有用。

编辑:每个字符串中只有一个数字块。

dub*_*jim 12

这假设数字后面有一些非数字文本:

echo "loremipsumdolorsit2367amet" \
| sed -r -e 's/[0-9]/0000000&/' -e 's/0*([0-9]{8}[^0-9])/\1/'
Run Code Online (Sandbox Code Playgroud)

结果:loremipsumdolorsit00002367amet

这并不假设:

... | sed -r -e 's/[0-9]/0000000&/' -e 's/0*([0-9]{8}([^0-9]|$))/\1/'
Run Code Online (Sandbox Code Playgroud)

这些使用 sed 的 ERE 模式。许多 sed 实现使用-r标志来指定这一点;有些人使用-E旗帜;有些同时使用。目前,在 sed 中使用 ERE 模式的能力不是 POSIX 标准的一部分,但有人谈论将其添加到标准中。我还没有遇到过不能以某种方式使用 ERE 模式的现代 sed 实现。

在某些情况下,有些事情您可以使用 ERE 模式来完成,而使用默认的 sed 模式 (BRE) 则无法做到。请参阅对此答案的评论。但在目前的情况下,使用 ERE 模式只是为了方便。正如 sch 在评论中所说,您可以省略-r(or -E) 标志,只需替换(...)with\(...\){8}with \{8\}。我的原始答案使用了+,这也不属于 BRE 模式;但实际上这对解决方案来说不是必需的。

  • -r 和 -E 都不是标准的。标准 sed 只接受 BRE(基本正则表达式)。只需将`+` 替换为`\{1,\}`,将`(...)` 替换为`\(...\)`,将`{...}` 替换为`\{...\}`这将是标准的,您不必担心。(<<< 也不是标准的) (2认同)

Sté*_*las 9

使用任何 sed:

sed 's/[0-9]\{1,\}/0000000&/g;s/0*\([0-9]\{8,\}\)/\1/g'
Run Code Online (Sandbox Code Playgroud)


dai*_*isy 5

perl 可以做到这一点:

perl -e 'my $a="loremipsumdolorsit2367amet"; $a =~ s/([0-9]+)/sprintf("%010d",$1)/e; print $a'
Run Code Online (Sandbox Code Playgroud)

得到了:

loremipsumdolorsit0000002367amet
Run Code Online (Sandbox Code Playgroud)

处理所有输入行:

perl -pe 's/([0-9]+)/sprintf("%010d",$1)/e'
Run Code Online (Sandbox Code Playgroud)