【发布时间】: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 的非贪婪匹配。