只有在满足条件后才进行替换

时间:2016-03-29 22:09:20

标签: bash unix sed

我有这个myfile的行:

dog
snake
dog
cat
dog    
snake
python
cat
dog  
cat
dog

这将取代所有与狮子的狗     sed -i's / dog / lion / g'

但是我想在文件中遇到第一个“cat”之后才进行替换

dog
snake
dog
cat
lion    
snake
python
cat
lion  
cat
lion

我该怎么做? 请注意,我不知道第一个“猫”在哪一行的先验。我必须找到第一只猫,然后从那里申请sed

3 个答案:

答案 0 :(得分:4)

使用range address

sed '/cat/,$s/dog/lion/' a.txt

此情况下的范围从第一次出现cat开始,到输入结尾处结束,由/cat/,$表示。

答案 1 :(得分:0)

sed解决方案翻译为awk

$ awk '/cat/,0{sub("dog","lion")}1' file 

说明:

从cat到文件末尾的

/cat/,0

sub("dog","lion")用狮子替换狗

1打印

答案 2 :(得分:0)

仅当前一行为lion时,处理dog代替cat的附加选项是:

sed "/cat/{N;s/dog/lion/;}"

例如,将您的数据文件另存为file.txt

$ sed "/cat/{N;s/dog/lion/;}" file.txt
dog
snake
dog
cat
lion
snake
python
cat
lion
cat
lion