Regex 从空格分隔的文本文件中提取特定键的所有值

Regex 从空格分隔的文本文件中提取特定键的所有值,regex,awk,grep,Regex,Awk,Grep,具有以下格式的文本文件: 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您可以使用sed: sed 's/15=\([^ ]*\

具有以下格式的文本文件:

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

您可以使用
sed

sed 's/15=\([^ ]*\)/\1/g;s/[0-9]\+[^ ]\+ //g' input.file

在OP添加预期输出之前给出了该答案,它也将起作用,但在每个值后添加一行新行:

如果您有GNU grep,则可以使用与perl兼容的正则表达式模式附带的:

grep -oP '(?<=15=)[^ ]*' <<< '1=23 2=44 15=xyz 5=abc 15=yyy 4=23 15=omnet 15=that'

您可以使用
sed

sed 's/15=\([^ ]*\)/\1/g;s/[0-9]\+[^ ]\+ //g' input.file

在OP添加预期输出之前给出了该答案,它也将起作用,但在每个值后添加一行新行:

如果您有GNU grep,则可以使用与perl兼容的正则表达式模式附带的:

grep -oP '(?<=15=)[^ ]*' <<< '1=23 2=44 15=xyz 5=abc 15=yyy 4=23 15=omnet 15=that'

您可以使用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 

您可以使用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 

使用
awk

awk -F'=' -v RS=' ' -v ORS=' ' '$1==15 { print $2 }' file
xyz yyy omnet that
将输入和输出记录分隔符设置为空格,将输入字段分隔符设置为
=
。测试第1列的条件是否为
15
。如果为真,则打印第二列

正如Ed Morton在评论中所建议的那样,这将留下一个尾随的空白字符,甚至不存在换行符。如果这是一个问题,您可以使用GNU
awk
为多字符
RS
使用以下命令

gawk -F'=' -v RS='[[:space:]]+' '$1==15{ printf "%s%s", (c++?OFS:""), $2 } END{print ""}' file

使用
awk

awk -F'=' -v RS=' ' -v ORS=' ' '$1==15 { print $2 }' file
xyz yyy omnet that
将输入和输出记录分隔符设置为空格,将输入字段分隔符设置为
=
。测试第1列的条件是否为
15
。如果为真,则打印第二列

正如Ed Morton在评论中所建议的那样,这将留下一个尾随的空白字符,甚至不存在换行符。如果这是一个问题,您可以使用GNU
awk
为多字符
RS
使用以下命令

gawk -F'=' -v RS='[[:space:]]+' '$1==15{ printf "%s%s", (c++?OFS:""), $2 } END{print ""}' file

不客气。就像后面的那个样子:)。。给出了一个生成预期输出(不带换行符)的附加sed示例,如果指定键的值是时间戳而不是简单的字符串,您将如何修改它?不需要进行修改,因为您是受欢迎的。就像后面的那个样子:)。。给出了一个生成预期输出(不带换行符)的附加sed示例,如果指定键的值是时间戳而不是简单字符串,您将如何修改它?不需要为此进行修改谢谢,这似乎只捕获给定行中键/值对的第一个实例。啊,是的,但每个匹配都打印在单独的行上,有没有办法在一行上打印所有匹配项?@shaz只需通过xargs进行输出。例如,如果
115=where
,则会产生不正确的输出,输入中存在,它将在输出中添加一个尾随空白字符。@EdMorton我同意,可以使用单词边界。建议一种比使用
tr
xargs printf
更好的方法?谢谢,这似乎只捕获给定行中键/值对的第一个实例。啊,是的,但每个匹配都打印在单独的行上,有没有一种方法可以在一行上打印所有匹配项?@shaz只需通过xargs进行输出。例如,如果输入中存在
115=which
,则会产生不正确的输出,并且会在输出中添加一个尾随空白字符。@EdMorton我同意,可以使用单词边界。建议一种比使用
tr
xargs printf
更好的方法?