首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Sed :在每一秒换行符上替换模式?

Sed :在每一秒换行符上替换模式?
EN

Unix & Linux用户
提问于 2012-08-01 11:35:08
回答 5查看 41.7K关注 0票数 11

是否有办法让sed在每一秒发生时替换该模式?或者至少每隔一秒?(当然,使用脚本是可能的,但我在问自己,sed是否能做到)。

编辑

我发现

代码语言:javascript
代码运行次数:0
运行
复制
sed -e "s/pattern/replacement/g;n"

但它取代了第一次发生,而不是第二次。

示例

输入文件:

代码语言:javascript
代码运行次数:0
运行
复制
I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern

期望产出:

代码语言:javascript
代码运行次数:0
运行
复制
I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement
EN

回答 5

Unix & Linux用户

回答已采纳

发布于 2012-08-01 12:22:05

请参阅https://stackoverflow.com/questions/5858200/sed-replace-every-nth-occurrence

解决方案使用awk而不是sed,但是“使用正确的工具执行任务”。在sed中可以或不可能这样做,但即使是这样,在awk或perl这样的工具中也要容易得多。

票数 6
EN

Unix & Linux用户

发布于 2012-08-01 11:44:25

代码语言:javascript
代码运行次数:0
运行
复制
sed 's/pattern/replacement/2'

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

如果您有GNU sed

代码语言:javascript
代码运行次数:0
运行
复制
sed '1~2N ; s/pattern/replacement/2'

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

票数 15
EN

Unix & Linux用户

发布于 2016-10-11 09:07:06

简单的解释:

在包含至少一种模式的第一行上,您希望忽略它并按-原样打印该行。在包含至少一种模式的第二行中,您希望用替换替换模式的第一个实例。在包含至少一种模式的第三行上,您希望按原样打印这一行。在包含至少一种模式的第四行中,您希望用替换替换模式的第一个实例。诸若此类。不匹配图案的线条应不加更改地打印出来。

使用Sed可以很容易地做到这一点:

代码语言:javascript
代码运行次数:0
运行
复制
sed -e '/PATTERN/ { :inside' -e 'n;s//REPLACEMENT/;t' -e 'b inside' -e '}'

或者,用更少的空格和更短的标签:

代码语言:javascript
代码运行次数:0
运行
复制
sed -e '/PATTERN/{:i' -e 'n;s//REPLACEMENT/;t' -e 'b i' -e '}'

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

将整个文档中模式的第二次出现替换为替换,无论它是否发生在与第一次发生相同的行上。保留第一次和第三次事件不变。等。

我相信这也可以用Sed来完成,尽管它要复杂得多,而且我相信它依赖于要使用的正则表达式。我将设法找出一些东西,并发布它,但我会让这个答案与上面的简单版本暂时站得住脚。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/44464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档