我知道这个问题的某种形式已被多次询问过,但我似乎无法获得我发现的任何解决方案。我在文件中有一行看起来像:
<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特有的。理想情况下,我希望能够替换双引号中的内容,但缺乏正则表达式。
答案 0 :(得分:2)
您可以尝试:
sed 's/unique\-identifier\=\"[^"]*\"/unique\-identifier\=\"NEW_TEXT\"/g' $file >> $newFile
↑
你的第一次尝试失败的原因是因为.*
是贪婪的,并且尽可能匹配表达的其余部分也可以匹配。在这种情况下,它也匹配" version="foobar
,表达式的其余部分(\"
)与最后一个字符匹配。
使用.*
替换[^"]
,使此部分符合非"
的所有内容。
您还可以删除表达式中的重复和不必要的转义,以使其更具可读性,如下所示:
sed 's/\(unique-identifier="\)[^"]*/\1NEW_TEXT/g' $file >> $newFile