perl - 使用 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 做到这一点?
解决方案
您可以尝试以下命令,看看它是否符合您的要求
perl -pe "s/TEXT.*?TEXT.//" test_1.txt
输出
IAM*WRITNG*THIS*TO*CHECK*WHETHER*IT*WILL*WORK*TEXT*REPEATING
推荐阅读
- java - GENERIC_PASSWORD 漏洞 Spring boot
- angular - Angular + NGINX + Docker:net::ERR_NAME_NOT_RESOLVED
- node.js - 异步/等待函数返回“未定义”而不是预期的字符串值
- godot - Godot中的平滑look_at()
- javascript - Rest api 设计与关系数据
- flutter - 颤振小时和分钟计数问题
- python - 如何转置数据集,将第一行保持为 ID python
- java - 如何将同一数组中的两个 int 添加到彼此并将它们转换为 int。在 Luhn 算法中
- r - 如何根据 R 中的一列计算平均时间?
- c# - 有没有办法让 ac# Winforms app F1 键导航到网站而不是 chm 文件?