Sed替换星号符号

use*_*252 6 regex bash sed

我正在尝试使用sed替换文本文件中的一系列星号符号和-999.9.但是我无法弄清楚如何正确地逃避通配符.

例如

$ echo "2006.0,1.0,************,-5.0" | sed 's/************/-999.9/g'
sed: 1: "s/************/-999.9/g": RE error: repetition-operator operand invalid
Run Code Online (Sandbox Code Playgroud)

不行.和

$ echo "2006.0,1.0,************,-5.0" | sed 's/[************]/-999.9/g'
2006.0,1.0,-999.9-999.9-999.9-999.9-999.9-999.9-999.9-999.9-999.9-999.9-999.9-999.9,-5.0
Run Code Online (Sandbox Code Playgroud)

为每个*提供-999.9,这也不是我想要的.

谢谢!

sat*_*sat 5

用这个:

echo "2006.0,1.0,************,-5.0" | sed 's/[*]\+/-999.9/g'
Run Code Online (Sandbox Code Playgroud)

测试:

$ echo "2006.0,1.0,************,-5.0" | sed 's/[*]\+/-999.9/g'
2006.0,1.0,-999.9,-5.0
Run Code Online (Sandbox Code Playgroud)


Ed *_*ton 5

这些(以及更多)中的任何一个都是正则表达式,可以根据需要修改该行:

$ echo "2006.0,1.0,************,-5.0" | sed 's/\*\**/999.9/g'
2006.0,1.0,999.9,-5.0

$ echo "2006.0,1.0,************,-5.0" | sed 's/\*\+/999.9/g'
2006.0,1.0,999.9,-5.0

$ echo "2006.0,1.0,************,-5.0" | sed -r 's/\*+/999.9/g'
2006.0,1.0,999.9,-5.0

$ echo "2006.0,1.0,************,-5.0" | sed 's/\*\{12\}/999.9/g'
2006.0,1.0,999.9,-5.0

$ echo "2006.0,1.0,************,-5.0" | sed -r 's/\*{12}/999.9/g'
2006.0,1.0,999.9,-5.0

$ echo "2006.0,1.0,************,-5.0" | sed 's/\*\{1,\}/999.9/g'
2006.0,1.0,999.9,-5.0

$ echo "2006.0,1.0,************,-5.0" | sed -r 's/\*{1,}/999.9/g'
2006.0,1.0,999.9,-5.0
Run Code Online (Sandbox Code Playgroud)

sed使用正则表达式而不是字符串,因此,如果您要使用sed,则需要学习正则表达式语法,尤其是BRE(默认情况下sed使用)和ERE(可以告知某些sed使用)之间的区别相反)和PCRE(sed从未使用过,但其他一些工具和“ regexp checkers”使用了)。仅上述第一个解决方案是BRE,它将在所有平台上的所有sed上运行。Google是您的朋友。


anu*_*ava 3

*是需要转义的正则表达式符号。

您甚至可以使用 BASH 字符串替换:

s="2006.0,1.0,************,-5.0"
echo "${s/\**,/-999.9,}"
2006.0,1.0,-999.9,-5.0
Run Code Online (Sandbox Code Playgroud)

使用sed

sed 's/\*\+/999.9/g' <<< "$s"
2006.0,1.0,999.9,-5.0
Run Code Online (Sandbox Code Playgroud)

  • 啊,当然是通配符。这又是一个线索,表明 shell 不适用于文本操作,因为即使他们使用的看起来像是用于文本操作的东西实际上也是完全不同的东西,这对于文件名生成来说是有意义的!也许将第一句话从“*是正则表达式符号”更改为“*是通配符符号,表示重复,在 shell 中用于通配符,在 sed、grep、awk 等 UNIX 工具中用于正则表达式”,然后说明您的2个脚本? (2认同)