【问题标题】:Sed - remove first occurence of string from fileSed - 从文件中删除第一次出现的字符串
【发布时间】:2016-03-01 04:15:22
【问题描述】:

我有一个名为 test.txt 的文件,其中包含以下内容:

test1
test2
test3
test4
test5
test3

我正在使用以下代码从文件中删除"test3"

sed -i '/test3/d' test.txt

但是我只想删除第一次出现的"test3"

【问题讨论】:

  • 添加一次性变量和条件,如$a++ || ...
  • 为什么这个问题有 Perl 标签?

标签: perl sed


【解决方案1】:

这个 sed 单行将帮助您:

sed '0,/test3/{/test3/d}' file
test1
test2
test4
test5
test3

这个 sed 命令使用了 sed 的地址。 sed 有不同的地址表达式,这在 sed 的信息页面中有详细说明。

对于这个命令,0, /pattern/会从第一行聚焦到第一行匹配/pattern/,然后执行动作:/pattern/d,即删除第一行匹配。完成此操作后,以下所有行将不满足地址0,/pattern/,因此采取默认操作:按原样打印。

【讨论】:

  • 你为什么不为你展示的这段代码添加一个解释,以便有人可以从中学习。
  • @TLP 解释已添加。希望它足够清楚。
  • 请为“已使用sed的地址”“sed的信息页面”添加超链接
  • @Kent:我知道,但假设我手头只有一个 WIndows 系统?
【解决方案2】:

依赖保持空间的另一种方法(我认为不如 Kent 的方法):

sed -e '/test3/{
                x
                /^$/d
               }'

这会寻找模式,然后如果它看到它,它会与第一次命中时为空的保持空间交换它,然后核对剩余的空白行。对于后续命中,保留空间将包含行本身,由第一次命中交换,因此交换将不执行任何操作,并且空白行删除将失败。

然而,我认为真正的答案是不要使用 sed:当事情变得复杂到需要任何思考时,我几乎总是发现使用 Perl 或其他任何东西更容易。

【讨论】:

  • 您对为什么这样做的解释只有部分意义,但是方法是合理的。
  • @potong:我已经详细解释了一点。
【解决方案3】:

在 Perl 中

 perl -pe 'next if /test3/ and not $seen++' test.txt

【讨论】:

  • print() continue{ } 中用于 -p 开关,所以 $_="" 而不是 next
【解决方案4】:

另一种 Perl 大锤方式

perl -0777 -p's/text3\n//' test.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多