使用 sed/perl/awk 替换第一次出现的匹配文本

Posted

技术标签:

【中文标题】使用 sed/perl/awk 替换第一次出现的匹配文本【英文标题】:Replace the first occurrence of a matching text using sed/perl/awk 【发布时间】:2020-04-27 14:57:57 【问题描述】:

我试图匹配一行中第一次出现的文本并使用 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 做到这一点?

【问题讨论】:

您能否提供示例with lines with more length 及其预期输出以阐明您的要求? 您说I was trying to match the first occurrence of a text - 请在您的问题中明确说明您要匹配的文本字符串是什么。照原样,我们会试图通过阅读您提供的脚本来猜测您想要什么,这些脚本显然不符合您的要求,所以 YMMV。 在 awk 中没有简单的方法可以做到这一点。使用 Perl 是最好的选择。 你知道有多少个[^*]*\*序列出现在数字之后和第二个TEXT之前吗?如果有,可以编码为sed;如果没有,你需要 Perl 的非贪婪匹配。 【参考方案1】:

与 sed 不同,在 Perl 中对模式进行分组只需要一对括号,而不是用反斜杠转义的括号:

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

【讨论】:

当行长度较长时,Perl 命令不起作用。有没有办法使用 awk 做到这一点? 您还没有用 awk 标记您的问题,那么为什么您现在要求使用 awk 解决方案?是什么让您认为 awk 解决方案比 perl 或 sed 更好?【参考方案2】:

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

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

输出

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

【讨论】:

我想根据 TEXTFORSAMPLE*NUMBER*123*345.05*678987 进行匹配。所以你的解决方案将不起作用。 @Kumar_123 -- 抱歉,我的错误是我查看了您的sed 输出而不是预期输出 @Kumar_123 -- 我做了一个小改动,试试新版本。【参考方案3】:

请您尝试以下方法:

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

【讨论】:

以上是关于使用 sed/perl/awk 替换第一次出现的匹配文本的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式删除第一次出现的空白,然后用逗号替换其余的选项卡

阔别港股五年的匹克体育,拿下3亿美元融资后回A股有望吗?

String.Replace 仅替换第一次出现的匹配字符串。如何替换 *all* 出现?

Bash:如何使用 sed 仅替换文件中的最后一次出现?

Ruby - 用另一个字符串替换第一次出现的子字符串

如何替换字符串中所有但第一次出现的模式