使用 sed 用“@”替换数字会在每个字符之间插入“@”

使用 sed 用“@”替换数字会在每个字符之间插入“@”

我想用“@”符号替换所有数字。我正在使用下面的 sed 命令,但没有得到所需的结果。

命令 -

echo "abc 434 pankaj 444" | sed 's/[0-9]*/@/g'

结果 -

@a@b@c@ @ @p@a@n@k@a@j@ @

答案1

嗯,很简单,[0-9]*匹配完全由以下内容组成的字符串零个或多个数字,包括空字符串。任何与空字符串匹配的内容都会在任意两个字符之间匹配,因此替换@会添加在输入中的所有字母之间。@由于表达式一次匹配所有连续数字,因此多位数字的字符串将替换为一位。

因此,在输入字符串中,ab43匹配项为[0-9]+(为了清楚起见,添加了一些空格):

    a   b   434
  ^   ^     ^^^- here, a string of some digits
  ^   ^- here, a zero-length string
  ^- here, a zero-length string

用于[0-9]精确匹配一位数字,或[0-9][0-9]*匹配一个或多个数字(或[0-9]+在扩展正则表达式中)。

答案2

将每个数字替换为@

echo "abc 434 pankaj 444" | sed 's/[0-9]/\@/g'
#Output: abc @@@ pankaj @@@

或将每个替换number@

echo "abc 434 pankaj 444" | sed 's/[0-9]\+/\@/g'
#Output: abc @ pankaj @

取决于您需要的输出

答案3

echo "abc 434 pankaj 444"| tr "[0-9]" "@"

abc @@@ pankaj @@@

答案4

根据您想要用 替换数字还是整数(连续数字)@,您可以使用tr不带或带-s选项的命令:

$ echo "abc 434 pankaj 444" | tr '[:digit:]' '[@*]'
abc @@@ pankaj @@@
$ echo "abc 434 pankaj 444" | tr -s '[:digit:]' '[@*]'
abc @ pankaj @

选项-s使tr实用程序“挤压”数据中第二个参数中连续出现的任何字符。在这种情况下,使用-s将字符tr组合@成单个@字符。

这两个参数[:digit:]告诉[@*]我们tr用字符替换数字@。大多数(全部?) 的实现tr允许您编写@代替[@*]作为第二个参数。字面[@*]意思是“与@第一个参数描述的集合中的字符一样多”。

请注意,如果有效,将压缩输入中tr任何预先存在的连续字符。@-s


您的方法sed无法按预期工作,因为您@在有零个或多个数字匹配的地方插入了一个字符。输入中每个字符之间有零位数字,因此每个字符之间的表达式匹配。

可以正确工作并用单个数字替换连续数字的修改后的替换@

sed 's/[[:digit:]]\{1,\}/@/g'

通过使用\{1,\}in 代替*(其本身与 相同\{0,\}),我们强制前面的表达式至少有一个匹配。您将看到以扩展正则表达式形式\{1,\}编写的内容。+

\{1,\}通过从表达式中删除并将替换保留为s/[[:digit:]]/@/g,您可以将每个单独的数字替换为@

相关内容