gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:18:58 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com