Sed替换星号符号

时间:2015-09-24 11:59:46

标签: regex bash sed

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

e.g。

$ echo "2006.0,1.0,************,-5.0" | sed 's/************/-999.9/g'
sed: 1: "s/************/-999.9/g": RE error: repetition-operator operand invalid

不起作用。和

$ 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,这不是我想要的。

谢谢!

5 个答案:

答案 0 :(得分:5)

使用此:

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

答案 1 :(得分: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

sed对正则表达式而不是字符串进行操作,因此如果你要使用sed,你需要学习正则表达式语法,特别是BRE(默认使用sed)和ERE(有些seds可以是被告知要使用)和PCREs(其他人从不使用其他工具和“regexp checkers”)。只有上面的第一个解决方案是BRE,它可以在所有平台上的所有seds上运行。谷歌是你的朋友。

答案 2 :(得分:2)

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

您甚至可以使用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

答案 3 :(得分:2)

Ya,*是特殊的元字符,它重复前一个标记零次或多次。依次转义*以匹配文字*个字符。

sed 's/\*\*\*\*\*\*\*\*\*\*\*\*/-999.9/g'

答案 4 :(得分:0)

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

public static void main(String[] args)
{
    int sum = 0;

    Scanner console = new Scanner(System.in);

    System.out.print("Please enter a Number: ");
    String num = console.nextLine();

    try
    {
        num = num.trim();

        System.out.print("Digits: ");

        for (int i = 0; i < num.length(); i++)
        {
            char d = num.charAt(i);
            int n = Integer.parseInt(String.valueOf(d));

            sum += n;

            System.out.print(d + ", ");
        }

        System.out.print("Sum: " + sum);
    }
    catch (NumberFormatException e)
    {
        System.out.print("Invalid Number entered");
    }       

    console.close();
}