sed:c命令,只更改第一行,删除文本

时间:2014-03-05 14:47:22

标签: macos bash sed

我正在进行第二天的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

一个“苹果”消失了!有没有解决的办法?请耐心等待,我是初学者......

提前致谢!

2 个答案:

答案 0 :(得分:5)

尝试

sed '1cApricot' prova

使用1,/Apple/,您可以定义一个范围,从第1行开始到第1行之后第一次出现Apple 结束。您想要的不是范围,虽然,只是一行。这可以通过仅使用1(而不是例如1,2)来实现。

以上命令对我有用,但取决于版本,如果不起作用,请尝试

sed '1c\
Apricot' prova

使用1,您告诉更改第一行。

如果您不一定要更改第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