首页 > 解决方案 > 使用 sed/perl/awk 替换第一次出现的匹配文本

问题描述

我试图匹配一行中第一次出现的文本并使用 sed 将其删除。但我开始知道 sed 是贪婪的,它不适用于我的情况,现在我正在尝试使用 Perl 实现相同的功能,但它不起作用。

cat test.txt
IAM*WRITNG*THIS*TEXT*FOR*SAMPLE*NUMBER*123*345.05*678987*TEST*OF*DATA*WITH*SOME*DUMMY*TEXT*TO*CHECK*WHETHER*IT*WILL*WORK*TEXT*REPEATING

预期输出:

IAM*WRITNG*THIS*TO*CHECK*WHETHER*IT*WILL*WORK*TEXT*REPEATING

使用 SED:

sed -e 's/\(TEXT\*.*\*.*\*.*\*.*\*.*\*678987\).*\(TEXT\*\)/\2/' test.txt

输出:

IAM*WRITNG*THIS*TEXT*REPEATING

使用 Perl:

perl -pe 's/\(TEXT\*.*\*.*\*.*\*.*\*.*\*678987\).*?\(TEXT\*\)/\2/' test.txt

输出:

IAM*WRITNG*THIS*TEXT*FOR*SAMPLE*NUMBER*123*345.05*678987*TEST*OF*DATA*WITH*SOME*DUMMY*TEXT*TO*CHECK*WHETHER*IT*WILL*WORK*TEXT*REPEATING

有人可以让我知道我做错了什么吗?

更新:我尝试了为 Perl 命令提供的解决方案,但它不适用于更长的行。有没有办法使用 awk 做到这一点?

标签: perlunixsed

解决方案


您可以尝试以下命令,看看它是否符合您的要求

perl -pe "s/TEXT.*?TEXT.//" test_1.txt

输出

IAM*WRITNG*THIS*TO*CHECK*WHETHER*IT*WILL*WORK*TEXT*REPEATING


推荐阅读