Sed:每隔两行换行是否替换模式?


10

有没有办法告诉sed每秒钟发生一次替换模式?还是至少每隔两行?(当然可以使用脚本,但是我问自己是否sed可以这样做)。

编辑

我发现

sed -e "s/pattern/replacement/g;n"

但是它取代了第一次出现的情况,而不是第二次出现的情况。

输入文件:

I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern

所需的输出:

I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement

Answers:


6

参见/programming/5858200/sed-replace-every-nth-occurrence

该解决方案使用awk而不是sed,而是“使用正确的工具完成工作”。这可能是也可能不是可能在sed做,但是,即使是这样,这将是一个很多像AWK或Perl的工具更容易。


1
使用我在那所学到的知识,我帮sed -e 'n;s/2004-2009/6e législature/g'我解决了问题。
Matthieu Riegler

1
不会每秒出现一次,它会每隔一行搜索您的模式。即跳过第一,第三,第五,第七等行。当然,这可能仍然适用于您的特定文档。
cas 2012年

是的,我知道。这就是我真正需要的。
Matthieu Riegler,2012年

14
sed 's/pattern/replacement/2'

将替换具有模式的每一行上的第二次出现。


如果您有GNU sed

sed '1~2N ; s/pattern/replacement/2'

从第一行开始1,其后的行将被添加到模式空间,N然后该s命令将替换第二次出现的模式。然后sed将向下移动两行~2并重复。


我不想第二秒,但每一秒。
Matthieu Riegler

我每行有一个模式。那行不通。
Matthieu Riegler

早知道那会很高兴。那么这种模式发生在第一,第二,第三和第四行(等)上,而您想替换第二,第四,第四行等上的模式吗?
llua 2012年

可能更短一些code
sed'1〜2s

2

简单解释:

在第一行中至少包含一个PATTERN事件,您要忽略它并按原样打印该行。在至少包含一个PATTERN事件的第二行上,您要用REPLACEMENT替换PATTERN的第一个实例。在至少包含一个PATTERN事件的第三行上,您希望按原样打印该行。在至少包含一个PATTERN事件的第四行上,您要用REPLACEMENT替换PATTERN的第一个实例。等等。与PATTERN不匹配的行应不变地打印。

可以使用Sed轻松完成,如下所示:

sed -e '/PATTERN/ { :inside' -e 'n;s//REPLACEMENT/;t' -e 'b inside' -e '}'

或者,使用较少的空白和较短的标签:

sed -e '/PATTERN/{:i' -e 'n;s//REPLACEMENT/;t' -e 'b i' -e '}'

编辑:我只是重新阅读了问题,并发现了更难的解释:

无论是否与第一次出现在同一行上,将整个文档中第二次出现的PATTERN都替换为REPLACEMENT。保留第一个和第三个出现的位置不变。等等。

我相信这也可以用Sed来完成,尽管它要复杂得多,而且我相信它取决于要使用的正则表达式。我将尝试解决并将其发布,但是现在我将使这个答案与上面的简单版本保持一致。


用uit 代替您的test q并接受输入{ sed '...'; cat; } <input(仅一次替换)
mikeserv

1

您非常接近,只需跳过第一行:

sed '1n;s/pattern/replacement/;n'

为什么awk在这种情况下应该是更好的工具?


0

一行内的一个符号模式:sed's /(a [^ a] *)a / \ 1c / g'

每隔第二个模式(每行只能出现一个模式匹配项。如果每行出现两个或更多匹配项,则仅替换第二个模式)

echo -e "test\nreplace_me\ntest\ntest\nreplace_me\nreplace_me\nreplace_me" | \
sed '/replace_me/{:a;N;/replace_me.*replace_me/!Ta;s/replace_me/replaced/2;}'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.