我正在寻找bash中可以在linux和OS X上运行的一行代码,用于删除包含所需字符串的第二行代码:
Header
1
2
...
Header
10
11
...应该变成
Header
1
2
...
10
11
...我的第一次尝试是使用sed的删除选项:
sed -i '/^Header.*/d' file.txt但是,这也删除了第一次出现的情况。
How to delete the matching pattern from given occurrence建议使用类似这样的东西:
sed -i '/^Header.*/{2,$d} file.txt但在OS X上会出现错误
sed: 1: "/^Header.*/{2,$d}": extra characters at the end of d command接下来,我尝试了替换,其中我知道如何使用2,$,以及随后的空行删除:
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,你必须使用
sed -i '' '2,$s/^Header.*//' file.txt
sed -i '' '/^\s*$/d' file.txt作为回报,这个不能在Linux上工作。
那么我的问题是,有没有一种简单的方法可以让它在任何Bash中工作?不需要sed,但应该尽可能地独立于shell,并且我需要修改文件本身。
发布于 2015-08-05 01:00:31
因为这是依赖于文件而不是依赖于行的,所以awk可能是一个更好的工具。
只需对这种情况发生的次数进行计数:
awk -v patt="Header" '$0 == patt && ++f==2 {next} 1' file这将跳过与给定模式完全匹配的行,并第二次执行此操作。在其余行上,它正常打印。
发布于 2015-08-05 04:26:46
为此,我建议使用awk:
awk '!/^Header/ || !f++' file这将打印所有不以"Header“开头的行。短路评估意味着如果||的左侧为真,则不评估右侧。如果行以Header开头,则第二部分!f++仅为true一次。
$ 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发布于 2015-08-05 05:49:33
这可能适用于您(GNU sed):
sed -i '1b;/^Header/d' file忽略第一行,然后删除所有以Header开头的行。
要删除后续出现的第一行而不考虑字符串,请使用:
sed -ri '1h;1b;G;/^(.*)\n\1$/!P;d' filehttps://stackoverflow.com/questions/31815099
复制相似问题