如何在文本旁边使用 Sed 或 Grep 编号

如何在文本旁边使用 Sed 或 Grep 编号

我有一个如下所示的文件。我想返回info2右边的值。其次,我想以相同的方式返回 info5 的值。

文件:

info1 218, info2 111, info3 415, info5 done,

答案1

awk

$ awk 'BEGIN { RS="," } $1 ~ /info[25]$/ { print $2 }' input
111
done

我们将输入记录分隔符 ( RS) 设置为逗号,然后对于第一个字段包含info后跟 2 或 5(没有其他内容)的每个记录,打印第二个字段。

答案2

略有改善乔罗巴的回答:

sed -n 's/.*info2 \([^,]*\).*/\1/p' file
  • -n意思是“除非特别命令,否则不要打印任何内容”。这(某种程度上)相当于 choroba 使用 来!d 删除(忽略)不匹配的行info2
  • 该命令的内容与 choroba 的非常相似,不同之处在于它捕获除逗号(不仅仅是数字)之外的任何字符的序列,因此它可以done从 中提取info5 done,
  • 该命令以p(print) 结尾,因为否则,使用 时-n,不会打印任何内容。

这样做的优点是不需要指定标签两次。 (如果一行包含 、 等,它不会产生不需要的结果)infoNinfo20info21

答案3

两步解决方案:

tr ',' '\n' <file | sed -n 's/^ *info[25] *//p'

tr示例文本转换为

info1 218   
 info2 111  
 info3 415  
 info5 done 

并且sed脚本删除info2info5字符串(以及任何周围的空白),留下所需的文本片段。其他行将被丢弃。

结果:

111
done

最好用 来完成awk,如DopeGhoti 的解决方案

awk基于我的方法的变体tr

tr ',' '\n' <file | awk '/info[25]/ { print $2 }'

答案4

您可以使用 sed:

sed '/info2 [0-9]/!d;s/.*info2 \([0-9]*\).*/\1/' file
  • /info2/是一个“地址”,任何包含该地址的行都info2被认为与该地址匹配。!d表示“删除地址之外的行”,因此只有包含的行info2才会被下一个命令处理。
  • 替换使用捕获组来记住 后面的数字info2,并且整行( 之前的所有内容info2info2本身、数字以及数字后面的任何内容)都被数字替换。

如果需要在 后面捕获“done” info5,则不能使用[0-9]*,但可以将其替换为[^,]*,即非逗号。

相关内容