我正在进行第二天的shell脚本编写,我偶然发现了这个问题:我想改变整行代码,我只用一个字来识别,我只想这样做第一次出现。
我正在使用sed和c命令,看起来像这样:
文件中名为“prova”的文字:
Apple is red
Apple is green
Banana
Tangerine
sed
代码:
sed -i.bak '1,/Apple/c\
Apricot
' prova
(我正在使用Mac OSX)
奇怪的是,并且与these guys报告的内容一致,如果我这样做,我会获得prova文件的输出:
Apricot
Banana
Tangerine
一个“苹果”消失了!有没有解决的办法?请耐心等待,我是初学者......
提前致谢!
答案 0 :(得分:5)
尝试
sed '1cApricot' prova
使用1,/Apple/
,您可以定义一个范围,从第1行开始到第1行之后第一次出现Apple
结束。您想要的不是范围,虽然,只是一行。这可以通过仅使用1
(而不是例如1,2
)来实现。
以上命令对我有用,但取决于sed版本,如果不起作用,请尝试
sed '1c\
Apricot' prova
使用1
,您告诉sed更改第一行。
如果您不一定要更改第1行,但第一次出现Apple
,则可以
sed '0,/Apple/s/.*Apple.*/Apricot/'
我在这里使用了替换命令s
(坦率地说,我从不使用c
),它仅适用于从行0
开始到第一次出现{{1}的范围}。如果找到Apple
,则整行将替换为Apple
。
答案 1 :(得分:1)
sed 's/PatternToFind/PatternToReplaceWith/option'
因此,如果你知道worked top find,请在s/
之后的第一部分使用它(PatternToFind ). This is a Reduce Regular Expression so be carefull with char like
*。[((and should be escape by
`之前),但字母数字是显式的。
将{整个)对应的模式替换为PatternToReplaceWith
(此处只有少数像\&
这样的字符是特殊的,应该通过\
转义
你也可以通过新行或;
sed 's/Apple/Pie/;s/Banana/Split/;s/Ice/Cream/g' YourFile
注意最后一个g表示线上的每一次出现。
仅对于第一次出现,您需要在缓冲区之前加载完整文件(在保持缓冲区中加载每一行,最后一行调用工作缓冲区中的缓冲区并进行替换
sed '1h;1!H
$ {x
s/Apple/Pie/;s/Banana/Split/;s/Ice/Cream/
}' YourFile