首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sed/Awk删除与字符串平台无关的第二次出现

问Sed/Awk删除与字符串平台无关的第二次出现
EN

Stack Overflow用户
提问于 2015-08-05 00:56:40
回答 3查看 6.3K关注 0票数 2

我正在寻找bash中可以在linux和OS X上运行的一行代码,用于删除包含所需字符串的第二行代码:

代码语言:javascript
复制
Header
1
2
...
Header
10
11
...

应该变成

代码语言:javascript
复制
Header
1
2
...
10
11
...

我的第一次尝试是使用sed的删除选项:

代码语言:javascript
复制
sed -i '/^Header.*/d' file.txt

但是,这也删除了第一次出现的情况。

How to delete the matching pattern from given occurrence建议使用类似这样的东西:

代码语言:javascript
复制
sed -i '/^Header.*/{2,$d} file.txt

但在OS X上会出现错误

代码语言:javascript
复制
sed: 1: "/^Header.*/{2,$d}": extra characters at the end of d command

接下来,我尝试了替换,其中我知道如何使用2,$,以及随后的空行删除:

代码语言:javascript
复制
sed -i '2,$s/^Header.*//' file.txt
sed -i '/^\s*$/d' file.txt

这在Linux上是有效的,但是在OS X上,正如这里提到的sed command with -i option failing on Mac, but works on Linux,你必须使用

代码语言:javascript
复制
sed -i '' '2,$s/^Header.*//' file.txt
sed -i '' '/^\s*$/d' file.txt

作为回报,这个不能在Linux上工作。

那么我的问题是,有没有一种简单的方法可以让它在任何Bash中工作?不需要sed,但应该尽可能地独立于shell,并且我需要修改文件本身。

EN

回答 3

Stack Overflow用户

发布于 2015-08-05 01:00:31

因为这是依赖于文件而不是依赖于行的,所以awk可能是一个更好的工具。

只需对这种情况发生的次数进行计数:

代码语言:javascript
复制
awk -v patt="Header" '$0 == patt && ++f==2 {next} 1' file

这将跳过与给定模式完全匹配的行,并第二次执行此操作。在其余行上,它正常打印。

票数 3
EN

Stack Overflow用户

发布于 2015-08-05 04:26:46

为此,我建议使用awk:

代码语言:javascript
复制
awk '!/^Header/ || !f++' file

这将打印所有不以"Header“开头的行。短路评估意味着如果||的左侧为真,则不评估右侧。如果行以Header开头,则第二部分!f++仅为true一次。

代码语言:javascript
复制
$ cat file
baseball
Header and some other stuff
aardvark
Header for the second time and some other stuff
orange
$ awk '!/^Header/ || !f++' file
baseball
Header and some other stuff
aardvark
orange
票数 1
EN

Stack Overflow用户

发布于 2015-08-05 05:49:33

这可能适用于您(GNU sed):

代码语言:javascript
复制
sed -i '1b;/^Header/d' file

忽略第一行,然后删除所有以Header开头的行。

要删除后续出现的第一行而不考虑字符串,请使用:

代码语言:javascript
复制
sed -ri '1h;1b;G;/^(.*)\n\1$/!P;d' file
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31815099

复制
相关文章

相似问题

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