我正在使用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?
答案 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)。