问题描述
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