![使用 sed 用“@”替换数字会在每个字符之间插入“@”](https://linux22.com/image/122961/%E4%BD%BF%E7%94%A8%20sed%20%E7%94%A8%E2%80%9C%40%E2%80%9D%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97%E4%BC%9A%E5%9C%A8%E6%AF%8F%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B9%8B%E9%97%B4%E6%8F%92%E5%85%A5%E2%80%9C%40%E2%80%9D.png)
我想用“@”符号替换所有数字。我正在使用下面的 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
,您可以将每个单独的数字替换为@
。