如何替换字符串"leading zero"



如何在 bash 中替换或删除字符串中的"0" 字符串基于 [前缀][ID][后缀] 例如ZZZ00004500AA010或ZZZ004500AA010 结果必须是 ZZZ4500AA010 所以我想删除 ID 中的前导 0 目前我有这个:

echo "ZZZ00004500AA010" | sed 's/0//'
echo "ZZZ004500AA010" | sed 's/0//'

这给了我:ZZZ0004500AA010或ZZZ04500AA010

如果你知道总是至少有一个零,你根本不需要 sed,你可以使用参数扩展。您可以使用正则表达式匹配来检查初始非数字后面是否有零:

#! /bin/bash
shopt -s extglob
for v in ZZZ00004500AA010 ZZZ004500AA010 ZZZ04500AA010 ZZZ4500AA010 ; do
if [[ $v =~ ^[^0-9]+0 ]] ; then
v=${v/+(0)/}
fi
echo "$v"
done

输出:

ZZZ4500AA010
ZZZ4500AA010
ZZZ4500AA010
ZZZ4500AA010

可以使用捕获组匹配数字以外的前导字符,然后匹配 0 个或多个数字。

在替换使用组 1 中。

^([^0-9]*)0+

正则表达式演示

echo "ZZZ00004500AA010" | sed -E 's/^([^0-9]*)0+/1/'
echo "ZZZ004500AA010" | sed -E 's/^([^0-9]*)0+/1/'

输出

ZZZ4500AA010
ZZZ4500AA010

如果必须有前导字符 A-Z:

^([A-Z]+)0+

正则表达式演示

使用这个 Perl 单行:

$ echo "ZZZ00004500AA010" | perl -pe 's{^([A-Za-z]+)0+}{$1}'
ZZZ4500AA010

Perl 单行代码使用这些命令行标志:
-e:告诉 Perl 在内联中查找代码,而不是在文件中查找代码.
-p:一次循环一行输入,默认情况下将其分配给$_。在每次循环迭代后添加print $_

s{PATTERN}{REPLACEMENT}: 将PATTERN更改为REPLACEMENT.
^: 字符串的开头.
([A-Za-z]+):匹配重复 1 次或多次的任何字母。捕获到捕获组 1 ($1).
0+: 零,重复 1 次或多次。

另请参阅:
perldoc perlrun: 如何执行 Perl 解释器: 命令行开关
perldoc perlre: Perl 正则表达式 (regexes)
perldoc perlre: Perl 正则表达式 (regexes): 量词;角色职业和其他特殊逃生;断言;捕获组
perldoc perlrequick:Perl 正则表达式快速入门

最新更新