Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 替换星号符号_Regex_Bash_Sed - Fatal编程技术网

Regex 替换星号符号

Regex 替换星号符号,regex,bash,sed,Regex,Bash,Sed,我正在尝试使用sed将文本文件中的一系列asterix符号替换为-999.9。但是,我不知道如何正确地转义通配符 e、 g 不起作用。及 $ 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 每*加-999.9,这也不是我想要的

我正在尝试使用sed将文本文件中的一系列asterix符号替换为-999.9。但是,我不知道如何正确地转义通配符

e、 g

不起作用。及

$ 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
每*加-999.9,这也不是我想要的


谢谢

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

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

s="2006.0,1.0,************,-5.0"
echo "${s/\**,/-999.9,}"
2006.0,1.0,-999.9,-5.0
使用
sed

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

sed's/\*\+/999.9/g'Ya,
*
是一种特殊的元字符,它将前一个标记重复零次或多次。转义
*
以匹配文字
*
字符

sed 's/\*\*\*\*\*\*\*\*\*\*\*\*/-999.9/g'
使用以下命令:

echo "2006.0,1.0,************,-5.0" | sed 's/[*]\+/-999.9/g'
测试:

$ echo "2006.0,1.0,************,-5.0" | sed 's/[*]\+/-999.9/g'
2006.0,1.0,-999.9,-5.0
其中任何一个(或更多)都是一个regexp,它将根据需要修改该行:

$ 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

sed操作正则表达式,而不是字符串,因此如果要使用sed,您需要学习正则表达式语法,尤其是BREs(sed默认使用)和EREs(可以告诉某些sed使用)与PCREs(sed从不使用,但其他一些工具和“regexp checker”使用)之间的区别。上面的第一个解决方案是BRE,它将在所有平台上的所有SED上工作。谷歌是你的朋友。

当这种可能性被引入gawk时,我不知道

gawk -F, '{sub(/************/,"-999.9",$3)}1' OFS=, file
2006.0,1.0,-999.9,-5.0 

我很惊讶第一个命令没有引入大量的
-999.9
,因为
\**
意味着零次或多次出现
*
echo“2006.0,1.0,************,-5.0”sed的输出是
999.92999.90999.90999.96999.9.999.90999.9999.9999.9999.999.90999.9999.9999.9999.9-999.95999.9.999.999.90999.9999-999.95999.9.999.90999.90999.9
,我希望您需要
\*\*\***
来处理一个或多个问题,如
\*+>>>>
,在shell中,就像在sed和其他工具中一样,但很明显,您没有这样做,idk为什么!实际上,
\**
甚至不是一个正则表达式,它是一个全局模式,匹配一个文本
*
,后面跟任何东西,这就是为什么我最后有
来阻止这个。啊,当然是全局模式。还有一个提示,shell不是用于文本操作的,因为即使是他们使用的看起来是用于文本操作的东西,实际上也是完全不同的,这对于文件名生成来说是有意义的!可能会将第一句话从
*是正则表达式符号
更改为
*是一个通配符,表示在用于全局绑定的shell中以及在诸如sed、grep、awk for regexps等UNIX工具中使用的重复,然后说明在您的两个脚本中哪个是?
gawk -F, '{sub(/************/,"-999.9",$3)}1' OFS=, file
2006.0,1.0,-999.9,-5.0