sed替换多个单词但跳过一个

时间:2014-10-23 00:55:20

标签: bash sed

我正在使用sed来查找和替换文件中与

匹配的单词
sed -i "s|word|words|g" file

我希望它改变第一个,跳过第二个并改变第三个匹配

file

var1=word
var2=/tmp/word
var3=word.txt

file 

var1=words
var2=/tmp/word
var3=words.txt

是否可以按原样保留var2?

3 个答案:

答案 0 :(得分:1)

sed -i "s|word|words|;s||words|2" file

更改第1个而不是第2个(原来是第3次更换的第3个)

但这是按行(sed的默认值)

所以它(对于文件)

sed -i 'H;${x;s/word/&s/;s//&s/2;s/.//p;}' file

首先在进行更改之前将整个文件加载到缓冲区

答案 1 :(得分:0)

尝试使用awk:

awk <file '/word/{num=num+1}{if (num!=2) gsub("word","words"); print}'

答案 2 :(得分:0)

sed 'H;$!d;x;:a;s/word/MATCH/1;s/word/IGNORE/1;s/word/MATCH/1;t a;s/MATCH/words/g;s/IGNORE/word/g' file

好吧,这可能看起来很复杂,但很简单 - 这会将所有文本复制到Hold空间,之后它使用3模式第一次出现匹配来修改查找文本(word)的替换常量(到避免重新处理)然后循环(ta)回到标签(:a),直到整个文件被处理后,它取代了替换常量。

如果您的数据存在问题,您可以使用您想要的任何替代常量(MATCH,IGNORE)。