如何在 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 正则表达式快速入门