【问题标题】:How match the last part of a line conditionally?如何有条件地匹配一行的最后一部分?
【发布时间】:2020-08-16 22:33:16
【问题描述】:

我对 perl 很陌生,目前我正在使用一个非常简单的 perl 正则表达式来打印从文件 1.txt 读取的字符串“Lecture”之后的行的最后一部分。。

cat 1.txt | perl -ne 'print "$1 \n" while /Lecture\s+(\d+\w)/g;'

效果很好,但我需要为其添加一个简单的条件:

First Preference 总是打印字符串“Lecture”之后的字符。 如果在一行中找不到字符串“Lecture”,只需打印行尾的字符即可。

PS:可能会出现字符串“Lecture”周围没有空格,并且我始终使用单词字符,因为它不一定是纯数字,它可以是字母数字。

示例
猫1.txt

Some Topic 1 Lecture 001
Some Topic 2 Lecture 002
Topic 3 ( classroom Session ) Lecture2B
Practicals 07A
Submissions 10
Topic5Lecture4

预期输出:

001
002
2B
07A
10
4

我最好想要一个可以直接在 cli/console 中运行的解决方案。 (就像我的原始代码一样 - cat 1.txt | perl code)。
我不想执行单独的 .pl 文件。

【问题讨论】:

  • 预期输出与描述不匹配“如果在一行中找不到字符串“Lecture”,只需在行尾打印字符。”,因为三个字符“07A”应该是单个字符“A”。这使您的问题不清楚。
  • @Yunnosch 很抱歉造成混乱,应该打印字符起始编号的实例
  • 我不明白“字符起始编号的非常实例”。也许“数字后跟一个字母”?但这不匹配,例如“001”。
  • 你认为你的问题的细节可能更一致地被你的家庭作业描述吗?在这种情况下,请直接在此处将其作为文本引用,而不是试图总结/改写。
  • 我根据我的理解编辑了您的问题。请仔细检查。我不想破坏它。

标签: perl


【解决方案1】:

这个

(?:\w*Lecture)?([^\s]+)$

将在行尾 ($) 捕获 ((...)) 所有 (+) 非空白 ([^\s]), 可选的 (?) 前面是非捕获的 ((?:...)) “讲座”,即使前面有其他字母 (\w*)。

得到想要的输出:

001
002
2B
07A
10
4
4

对于示例输入:

Some Topic 1 Lecture 001
Some Topic 2 Lecture 002
Topic 3 ( classroom Session ) Lecture2B
Practicals 07A
Submissions 10
Topic5 Lecture4
Topic5Lecture4

【讨论】:

  • 非常感谢您的回答-我正在运行此命令-cat 1.txt | perl -ne 'print "$1 \n" while /(?:Lecture)?([^\s]+)$/g;'由于某种原因它弄错了最后一行并完全打印该行而不是仅仅 4
  • 我适应了改变的输入。我使用较旧的示例输入作为我的第一个版本答案,然后在您编辑后盲目复制示例输入...
  • 您好,先生,请您看一下这个 - del.dog/aperyleppy.txt
  • 请把它变成一个新的专门问题。在 StackOverflow 社区中,单独处理用户被认为是不合适的。如果每个人都在帮助,你获得帮助的机会会更大,而不仅仅是我。另外,你认为我应该把答案放在哪里?确保为显示的输入添加所需的输出。此外,该输入的格式似乎与您在此处提供的示例非常不同。主要区别在于线条不会以您想要的部分结尾。 (对不起,如果我误解了这一点,尤其是在编辑你的问题时。我假设你想保持现在的状态。)
  • 对不起,但扩大用例并希望得到更新的答案被认为是“移动目标问题”,不受欢迎。来吧,提出一个新问题。我可能无法抗拒回答。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 2019-08-20
  • 1970-01-01
相关资源
最近更新 更多