正则表达式,选择以我的条件开头的行,但只取空格后的字符

Posted

技术标签:

【中文标题】正则表达式,选择以我的条件开头的行,但只取空格后的字符【英文标题】:Regex, select the line that starts with my condition, but take only the characters after space 【发布时间】:2021-06-05 19:29:30 【问题描述】:

我有一个文件,其内容与以下类似:

ptrn: 435324kjlkj34523453
Note1: rtewqtiojdfgkasdktewitogaidfks
Note2: t4rwe3tewrkterqwotkjrekqtrtlltre

我试图在以 "ptrn:" 开头的行的空格后获取字符。我正在尝试下面的命令;

>>> cat daily.txt | grep '^p.*$' > dailynew.txt

我在新文件中得到结果:

ptrn: 435324kjlkj34523453

但我只想将空格后面的字符,即“435324kjlkj34523453”写入新文件中,而不用开头的“ptrn:”。

所以结果应该是这样的:

435324kjlkj34523453

如何使用高效的正则表达式代码建立这个目标?

【问题讨论】:

【参考方案1】:

你可以使用

grep -oP '^ptrn:\s*\K.*' daily.txt > dailynew.txt
awk '/^ptrn:/print $2' daily.txt > dailynew.txt
sed -n 's/^ptrn:[[:space:]]*\(.*\)/\1/p' daily.txt > dailynew.txt

请参阅online demo。全部输出435324kjlkj34523453

grep PCRE 正则表达式(启用-P 选项)中,模式匹配

^ - 字符串的开头 ptrn: - ptrn: 子字符串 \s* - 零个或多个空格 \K - 清除当前匹配值的匹配重置运算符 .* - 该行的其余部分。

awk 命令中,^ptrn: 正则表达式用于查找以ptrn: 开头的行,然后print $2 从第二个“列”开始打印第一个空格之后的值(因为默认的字段分隔符在awk 中是空格)。

sed中,命令的意思

-n - 禁止默认行输出 s - 使用替换命令 ^ptrn:[[:space:]]*\(.*\) - 字符串开头,ptrn:,零个或多个空格,其余行捕获到第 1 组 \1 - 将匹配替换为第 1 组值 p - 打印替换结果。

【讨论】:

【参考方案2】:

你可以使用这个sed:

sed -nE 's/^ptrn: (.*)/\1/p' file > output_file.txt

【讨论】:

我需要将输入文件指向哪里,例如daily.txt? 您使用> 将输出重定向到一个文件,然后是文件名。

以上是关于正则表达式,选择以我的条件开头的行,但只取空格后的字符的主要内容,如果未能解决你的问题,请参考以下文章

如何为提及和主题标签修复此正则表达式?

正则表达式

正则表达式排除“:”和空格(如果存在)

JavaScript 正则表达式 - 从开头和结尾删除空格

vim删除空行和注释

linux grep 正则表达式