我在查找sed
脚本时遇到问题,该脚本在正则表达式看起来完全相同时有效,但我只想替换一个。
该文件如下所示:
something someting something
this
something someting something
something someting something
this
someting something
someting something
someting something
this
someting something
someting something
this
我想用第三个“this”代替其他东西。我尝试过:
sed '3,/this.*/s/this.*/something/'
和各种类似的尝试,但它不起作用。
答案 0 :(得分:4)
这在sed中并不容易,但是awk可以做到这一点
awk '/this/{count++;if(count==3){sub("this","something")}}1'
答案 1 :(得分:2)
尝试类似:
# do nothing the first 2 times (weird sed counting makes that 3)
3,/this.*/n
# then, substitute only once
1,/this.*/ s/this.*/foo/
要将换行符嵌入shell脚本中,我可能会使用GNU“echo -e”来欺骗“\ n”:
sed -e "$(echo -e "3,/this.*/n\n1,/this.*/ s/this.*/foo/ ")"
答案 2 :(得分:1)
我实际上不会说在sed
中是不可能的;我肯定会说这不适合这份工作。我会选择Perl,但选择你喜欢的脚本语言。
#!/usr/bin/env perl
use strict;
use warnings;
my $this_count = 0;
LINE:
while (<>)
{
if (m/^this$/ && ++$this_count == 3)
{
$_ = "that\n"; # Note the newline; I didn't chomp!
}
print;
}
答案 3 :(得分:1)
这可能对您有用:
sed '/this/{x;s/^/X/;/^XXX$/!{x;b};x;s/this/something/}' file
说明:
每次出现this
时,X
会向保留空间(HS)附加X
。如果HS包含3个this
,请将something
替换为sed -e '/this/{x;s/^/X/;/^XXX$/!{x;b};x;c\something' -e '}' file
。
编辑:
这也会起作用(基本相同的想法):
{{1}}