首次出现数字后的grep字符串

时间:2018-02-06 13:36:15

标签: linux string unix grep

如何在第一次出现数字后获取字符串?

例如,我有一个包含多行的文件:

  34 abcdefg
10 abcd 123
    999 abc defg

我想获得以下输出:

abcdefg
abcd 123
abc defg

谢谢。

5 个答案:

答案 0 :(得分:2)

你可以使用Awk,循环遍历每行中的所有列到NF(每行的最后一列),一旦匹配第一个单词,打印旁边的列。 break语句将在第一次迭代后退出for循环。

awk '{ for(i=1;i<=NF;i++) if ($i ~ /[[:digit:]]+/) { print $(i+1); break } }' file

答案 1 :(得分:1)

目前尚不清楚您究竟想要什么,但您可以尝试在sed中表达它。 删除所有内容,直到第一个数字,下一个数字和任何空格。

sed 's/[^0-9]*[0-9]\+ *//'

答案 2 :(得分:0)

您可以使用sed删除数字和空格:

sed -E 's/[0-9 ]+//' file

答案 3 :(得分:0)

想象一下以下两个输入文件:

  001 ham
03spam
  3 spam with 5 eggs

使用awk的快速解决方案是:

awk '{sub(/[^0-9]*[0-9]+/,"",$0); print $1}' <file>

此行将第一个字符串替换为不包含数字的任何内容,后跟数字乘以空集("")。这种方式$0被重新定义,您可以重新打印第一个字段或字段的其余部分。该行给出了以下输出。

ham
spam
spam

如果您对该行的其余部分感兴趣

awk '{sub(/[^0-9]*[0-9]+ */,"",$0); print $0}' <file>

这将作为输出:

ham
spam
spam with 5 eggs

请注意,正则表达式中需要额外的" *"以删除数字后面的所有尾随空格。没有它,你会得到

awk '{sub(/[^0-9]*[0-9]+/,"",$0); print $0}' <file>

 ham
spam
 spam with 5 eggs

答案 4 :(得分:0)

grep可以完成这项工作:

$ grep -o -P '(?<=[0-9] ).*' inputFIle
abcdefg
abcd 123
abc defg

为了完整起见,这是一个perl的解决方案:

$ perl -lne 'print $1 if /[0-9]+\s*(.*)/' inputFIle
abcdefg
abcd 123
abc defg