![对先前正则表达式匹配的行(单行)执行正则表达式搜索](https://linux22.com/image/86460/%E5%AF%B9%E5%85%88%E5%89%8D%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C%EF%BC%88%E5%8D%95%E8%A1%8C%EF%BC%89%E6%89%A7%E8%A1%8C%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%90%9C%E7%B4%A2.png)
我需要打印一个位于长文本文件中唯一行的字符串。文件中的相关行示例long.txt
:
Software version 4.0.10, 2002-03-28
想要的字符串正是4.0.10
.
步骤大概是:
- 匹配线;例如使用正则表达式,例如
/^Software/
- 找到该行后,在其上搜索所需的字符串(另一个正则表达式)
- 打印字符串
如何使用sed
、awk
或等工具在一行(请不要使用管道)中完成此操作perl
?
注意:实际的正则表达式并不那么相关。最重要的是所涉及的命令和语法。谢谢!
答案1
你的问题很笼统;我想花点时间讨论一下它的设计sed
以及它如何处理此类用例。
sed
是流编辑器。它接受流中的文本输入(无论是来自管道、单个文件还是来自一系列文件),对该文本流执行操作并输出文本。 (注意,这是不是其原始概念旨在或设计用于文件编辑,尽管它经常为此目的投入使用。)
sed
您应该了解的操作要点是:
sed
逐行处理文本。您给出的命令本质上是一个循环,它对每一行输入进行操作(默认情况下),并在最后打印结果(默认情况下)。- 命令
sed
由可选的条件测试(或“模式”)和要执行的操作组成。 - 所有操作都是单个字符命令,例如
p
rint、s
ubstitute、d
elete - 最常见的条件是与行匹配的正则表达式,但也可以使用行号。
- 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