bash - Sed/Awk 删除第二次出现的字符串 - 平台无关

标签 bash awk sed

我正在 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/

相关文章:

mysql - 加载数据文件 - 上传 CSV 文件

linux - 使用 -c 和 awk 的管道字符串调用 bash 命令

bash - 检查特定列中的单词,检查该行其他列中的值,将该行剪切并粘贴到新的文本文件

linux - 如何按日期对多个日志文件的输出进行排序

bash - 使用 sed 进行字段排序

bash - 向上舍入 bc 比例而不是用 scale 或 printf 向下舍入

Bash 脚本 - 在脚本中执行和 grep 命令

awk - 选择等于awk中不同值的行

bash - 如何让 awk 不使用空格作为分隔符?

regex - 如何使用 sed 搜索并替换在同一行中多次出现的模式?