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

问题描述

我有一个包含以下内容文件

ptrn: 435324kjlkj34523453
Note1: rtewqtiojdfgkasdktewitogaidfks
Note2: t4rwe3tewrkterqwotkjrekqtrtlltre

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

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

我在新文件中得到结果:

ptrn: 435324kjlkj34523453

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

所以结果应该是这样的:

435324kjlkj34523453

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

解决方法

你可以使用

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 选项启用)中,模式匹配

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

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

sed中,命令表示

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

您可以使用此sed

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