用sed替换字符串的一部分

时间:2015-06-10 20:11:52

标签: bash sed

我知道这个问题的某种形式已被多次询问过,但我似乎无法获得我发现的任何解决方案。我在文件中有一行看起来像:

<package foo="bar" unique-identifier="NEEDS_TO_BE_REPLACED" version="foobar">

我需要更换上面指出的部分,但我似乎总是更改不需要的信息。需要替换的文本因文件而异,因此目前我在其中使用通配符。以下是我尝试过的事情。

sed 's/unique\-identifier\=\".*\"/unique\-identifier\=\"NEW_TEXT\"/g' $file >> $newFile

sed 's/\bunique\-identifier\=\".*\"\b/unique\-identifier\=\"NEW_TEXT\"/g' $file >> $newFile

sed 's/\<unique\-identifier\=\".*\"\>/unique\-identifier\=\"NEW_TEXT\"/g' $file >> $newFile

sed 's/[[:<:]]unique\-identifier\=\".*\"[[:>:]]/unique\-identifier\=\"NEW_TEXT\"/g' $file >> $newFile

所有这些都是我发现的各种解决方案,最后一个是Mac OSX特有的。理想情况下,我希望能够替换双引号中的内容,但缺乏正则表达式。

1 个答案:

答案 0 :(得分:2)

您可以尝试:

sed 's/unique\-identifier\=\"[^"]*\"/unique\-identifier\=\"NEW_TEXT\"/g' $file >> $newFile
                             ↑

你的第一次尝试失败的原因是因为.*是贪婪的,并且尽可能匹配表达的其余部分也可以匹配。在这种情况下,它也匹配" version="foobar,表达式的其余部分(\")与最后一个字符匹配。

使用.*替换[^"],使此部分符合非"的所有内容。

您还可以删除表达式中的重复和不必要的转义,以使其更具可读性,如下所示:

sed 's/\(unique-identifier="\)[^"]*/\1NEW_TEXT/g' $file >> $newFile