sed不替换变量

时间:2019-10-15 15:23:31

标签: linux sed

我正在尝试替换apache文件中的一些正则表达式行。 我定义:

    console.log(selectedInvoices);
    this.selectedInvoices = selectedInvoices;
    let subtotal = 0;
    this.selectedInvoices.forEach((selectedInvoice) => {
    subtotal = +subtotal + +selectedInvoice.paymentAmt;
    });
    this.Subtotal =  subtotal;
    this.fee = this.feePercent / 100 * this.Subtotal;
    this.totalPayment = this.Subtotal + this.fee;
    console.log(this.selectedInvoices);

我执行时:

OLD1="[0-9]*.[0-9]+"

NEW1="[a-z]*.[0-9]"

没有变化。

这就是我试图做的事情

sed -i 's/$OLD1/$NEW1/g' demo.conf  

我期望新文件将$ OLD1替换为$ NEW1

2 个答案:

答案 0 :(得分:3)

您需要匹配精确的字符串

您需要一些可以与[0-9]*.[0-9]+不太匹配的精确字符串sed匹配的东西。

因此,我改为使用此管道一次替换一个字符
(我认为它也更易于阅读):
echo "[0-9]*.[0-9]+" | sed 's/0/a/' | sed 's/9/z/' | sed 's/+//'

您必须cat文件或将find与execute配合使用才能应用此管道。

我尝试了以下操作(从其他答案)
 -sed 's/\<exact_string/>/replacement/'
不起作用,因为\<\> 单词边界< / strong>。
 -sed 's/(CB)?exact_string/replacement/'
在一个答案中找到,但在文档中找不到

我使用了 Win 10 bash git bash online Linux tools,结果相同。

当我认为匹配在模式而不是确切的字符串上

替换不能是正则表达式-最多可以引用匹配的正则表达式部分。来自man sed

  

s/regexp/replacement/   尝试将正则表达式与模式空间进行匹配。如果成功,则替换与替换匹配的那部分。替换可能包含特殊字符&来表示匹配的模式空间部分,特殊转义\ 1到\ 9表示正则表达式中的相应匹配子表达式。


此外,除非您根据问题下的注释为扩展的正则表达式添加选项.,否则必须在正则表达式中转义某些字符(特别是+-E)。
(仅在您想在句号.上匹配而不是any character的情况下提示)

$ echo "01.234--ZZZ" | sed 's/[0-9]*\.[0-9]\+/REPLACEMENT/g'
REPLACEMENT--ZZZ

答案 1 :(得分:3)

OLD1="[0-9]*.[0-9]+"

由于[ * .在sed中都是具有特殊含义的字符,因此我们需要对其进行转义。对于这种简单的情况,可能会发生以下情况:

OLD2=$(<<<"$OLD1" sed 's/[][\*\.]/\\&/g')

它将OLD2设置为\[0-9\]\*\.\[0-9\]+。请注意,它无法处理所有可能的情况,例如OLD1='\.\['将转换为OLD2='\\.\\[,这意味着有所不同。实施适当的正则表达式以适当地逃避我留给他人练习的其他正则表达式。

现在您可以:

sed "s/$OLD2/$NEW1/g"

经过测试:

OLD1="[0-9]*.[0-9]+"
NEW1="[a-z]*.[0-9]"
sed "s/$(sed 's/[][\*\.]/\\&/g' <<<"$OLD1")/$NEW1/g" <<<'XYZ="[0-9]*.[0-9]+"'

将输出:

XYZ="[a-z]*.[0-9]"