是否有办法让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
发布于 2012-08-01 04:22:05
请参阅https://stackoverflow.com/questions/5858200/sed-replace-every-nth-occurrence
解决方案使用awk而不是sed,但是“使用正确的工具执行任务”。在sed中可以或不可能这样做,但即使是这样,在awk或perl这样的工具中也要容易得多。
发布于 2012-08-01 03:44:25
sed 's/pattern/replacement/2'
将替换具有模式的每一行上的第二次出现。
如果您有GNU sed
:
sed '1~2N ; s/pattern/replacement/2'
从第一行1
开始,它之后的行将被添加到模式空间N
,然后s
命令将替换该模式的第二次出现。然后sed
将沿着~2
移动两条线并重复。
发布于 2016-10-11 01:07:06
简单的解释:
在包含至少一种模式的第一行上,您希望忽略它并按-原样打印该行。在包含至少一种模式的第二行中,您希望用替换替换模式的第一个实例。在包含至少一种模式的第三行上,您希望按原样打印这一行。在包含至少一种模式的第四行中,您希望用替换替换模式的第一个实例。诸若此类。不匹配图案的线条应不加更改地打印出来。
使用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 '}'
编辑:我只是重新阅读了这个问题,发现了更难理解的问题:
将整个文档中模式的第二次出现替换为替换,无论它是否发生在与第一次发生相同的行上。保留第一次和第三次事件不变。等。
我相信这也可以用Sed来完成,尽管它要复杂得多,而且我相信它依赖于要使用的正则表达式。我将设法找出一些东西,并发布它,但我会让这个答案与上面的简单版本暂时站得住脚。
https://unix.stackexchange.com/questions/44464
复制