我目前正在尝试通过将其通过管道传输到 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 模式;但实际上这对解决方案来说不是必需的。
使用任何 sed:
sed 's/[0-9]\{1,\}/0000000&/g;s/0*\([0-9]\{8,\}\)/\1/g'
Run Code Online (Sandbox Code Playgroud)
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)
归档时间: |
|
查看次数: |
7199 次 |
最近记录: |