我正在 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,并且我需要修改文件本身。
最佳答案
由于这是文件相关的而不是行相关的,awk
可能是一个更好的工具。
只需记录这种情况发生的次数即可:
awk -v patt="Header" '$0 == patt && ++f==2 {next} 1' file
这会跳过与给定模式完全匹配的行并第二次执行。在其余行中,它正常打印。
关于bash - Sed/Awk 删除第二次出现的字符串 - 平台无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31815099/