如何使用正则表达式生成仅在包含另一个特定字符的行中某个字符之前出现的字符列表?

如何使用正则表达式生成仅在包含另一个特定字符的行中某个字符之前出现的字符列表?

我有一个如下所示的文本文件:

407-OL?
408-2-OL?
408-OL?
418-het?
420-1 and 2- OL?
429-2-left unscored?
430-2-left both unscored?
431-1 and 2- Ri??
436-1-just homozygote?
444-2-het? ins. both
456-2-ins 246 despite slight OL
456-1-ins 245 (weaker)
457-2-Ri?

我希望它返回左侧的数字(破折号之前),但仅限于包含问号的行。换句话说,我希望这是输出:

407
408
408
418
420
429
430
431
436
444
457

答案1

可能是最简单的方法:cat some_file | grep '?' | cut -d'-' -f1

  • cat somefile=> 将内容some_file送入管道
  • grep '?'=> 仅过滤包含 a 的行?
  • cut -d'-' -f1=> 将字符串划分为字段-作为字段分隔符,然后打印字段 #1

答案2

sed通常是或 的任务awk

sed -n '/?/s/-.*//p' some_file

awk -F- '/\?/{print$1}' some_file

答案3

更容易的是通过正则表达式捕获每个数字^\d+,例如:

grep '?' file.txt | grep -o '^\d\+'

在哪里:

  • ^行的开头
  • \d\+多次匹配任何数字字符

相关内容