对先前正则表达式匹配的行(单行)执行正则表达式搜索

对先前正则表达式匹配的行(单行)执行正则表达式搜索

我需要打印一个位于长文本文件中唯一行的字符串。文件中的相关行示例long.txt

Software version 4.0.10, 2002-03-28

想要的字符串正是4.0.10.

步骤大概是:

  • 匹配线;例如使用正则表达式,例如/^Software/
  • 找到该行后,在其上搜索所需的字符串(另一个正则表达式)
  • 打印字符串

如何使用sedawk或等工具在一行(请不要使用管道)中完成此操作perl

注意:实际的正则表达式并不那么相关。最重要的是所涉及的命令和语法。谢谢!

答案1

你的问题很笼统;我想花点时间讨论一下它的设计sed以及它如何处理此类用例。

sed是流编辑器。它接受流中的文本输入(无论是来自管道、单个文件还是来自一系列文件),对该文本流执行操作并输出文本。 (注意,这是不是其原始概念旨在或设计用于文件编辑,尽管它经常为此目的投入使用。)

sed您应该了解的操作要点是:

  • sed逐行处理文本。您给出的命令本质上是一个循环,它对每一行输入进行操作(默认情况下),并在最后打印结果(默认情况下)。
  • 命令sed由可选的条件测试(或“模式”)和要执行的操作组成。
  • 所有操作都是单个字符命令,例如print、substitute、delete
  • 最常见的条件是与行匹配的正则表达式,但也可以使用行号。
  • A范围可以指定,意思是:对所有行执行以下操作(第一个条件)取决于(第二个条件)。

非常详尽的教程和参考sed在线免费提供,我建议您完整阅读。

对于您的场景,您想要的命令类似于:

sed -n -e '/^Software/{s/,.*//;s/.*[[:space:]]//;p;}' filename

翻译过来就是:

  • -n:抑制sed打印每行输入的默认操作
  • -e:执行以下sed命令
  • /^Software/{}:仅在与此正则表达式匹配的行上执行 中包含的以下命令集
  • s/,.*//:删除该行中的第一个逗号(及其后的所有内容)
  • s/.*[[:space:]]//:删除行中直到最后一个空白字符的所有内容
  • p:打印结果文本。

答案2

这里有一些选项供您选择

sed -n 's/Software version \([^,]\+\).*/\1/p' file
awk -F '[ ,]' '$1=="Software" && $2=="version" {print $3}' file
perl -nE '/Software version (.+?),/ and say $1' file
grep -oP '(?<=Software version ).+?(?=,)' file

所有假设版本字符串中没有逗号。

答案3

尝试一下这个经过测试的版本:

 awk '{if ($0 ~ /^Software/) {print substr($3,1,length($3)-1)}}' long.txt

它打印每行的第三个元素,以软件

子字符串用于删除最后一个字符',' 从第三个元素开始。

考试:

awk '{if ($0 ~ /^Software/) {print substr($3,1,length($3)-1)}}' long.txt
4.0.10

相关内容