有一个格式为
的文本文件1=23 2=44 15=17:31:37.640 5=abc 15=17:31:37.641 4=23 15=17:31:37.643 15=17:31:37.643
我需要一个正则表达式来提取多行文本文件的键15的所有值
输出应该是
17:31:37.640 17:31:37.641 17:31:37.643 17:31:37.643
很抱歉,我应该说明我尝试提取的值是时间戳17:31:37.643
答案 0 :(得分:2)
您可以使用sed
:
sed 's/15=\([^ ]*\)/\1/g;s/[0-9]\+[^ ]\+ //g' input.file
在OP添加预期输出之前给出了答案,它也会起作用,但在每个值之后添加一个新行:
如果你有GNU grep,你可以使用perl兼容的正则表达式模式附带的lookbehind assertion:
grep -oP '(?<=15=)[^ ]*' <<< '1=23 2=44 15=xyz 5=abc 15=yyy 4=23 15=omnet 15=that'
输出:
xyz
yyy
omnet
that
答案 1 :(得分:2)
您可以使用GNU grep来提取子字符串。
grep -Po '\b15=\K\S+' | tr '\n' ' '
-P
选项将模式解释为Perl正则表达式。-o
选项仅显示与模式匹配的匹配部分。\K
抛弃了与此相匹配的所有内容。输出
17:31:37.640 17:31:37.641 17:31:37.643 17:31:37.643
答案 2 :(得分:2)
使用awk
:
awk -F'=' -v RS=' ' -v ORS=' ' '$1==15 { print $2 }' file
xyz yyy omnet that
将输入和输出记录分隔符设置为空格,将输入字段分隔符设置为=
。测试column1的条件为15
。如果是这样,请打印第二列。
正如Ed Morton在评论中所建议的那样,这会留下一个空白的空白字符,甚至是一条缺席的新行。如果这是一个问题,您可以使用GNU awk
对多字符RS
使用以下内容。
gawk -F'=' -v RS='[[:space:]]+' '$1==15{ printf "%s%s", (c++?OFS:""), $2 } END{print ""}' file