正则表达式,选择以我的条件开头的行,但只取空格后的字符
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? 您使用>
将输出重定向到一个文件,然后是文件名。以上是关于正则表达式,选择以我的条件开头的行,但只取空格后的字符的主要内容,如果未能解决你的问题,请参考以下文章