在同一行上使用grep打印多个正则表达式匹配项

0x0

我正在尝试使用grep匹配所有数字,包括整数和十进制,并在同一行上打印匹配项(以便更轻松地使用gnuplot进行绘制)。例如,

echo "bench-100-net-buffering1000.out:Throughput: 3212.97" | grep -E -o '\d+(\.\d+)?'

版画

100
1000
3212.97

但是如何在同一行中将所有内容如下所示?

100  1000  3212.97

编者注:问题的原始形式\d+与正则表达式一样使用,反映在一些较早的答案中。

最终,我希望它可以使用多个输入文件,如下所示:

grep Throughput *.out | grep -E -o '\d+(\.\d+)?'

应该打印

100  1000  3212.97
200  3000  5444.77
300  5000  6769.32
jm666

其他一些变体:

下面的每个示例都使用此正则表达式:

(\d+\.\d*|\.\d+|\d+)

它与一组匹配ddd. ddd.ddd .ddd ddd如果您的小数位不同,例如不想捕获.ddd(仅十进制)变体,只需将其从正则表达式中删除即可。

一个文件/字符串的用法

#using `paste`
echo "bench-100-net-buffering1000.out:Throughput: 3212.97"  | grep -Eo '(\d+\.\d*|\.\d+|\d+)' | paste -s -
# using echo for making the "one line"
echo $(grep -Eo '(\d+\.\d*|\.\d+|\d+)' <<< "bench-100-net-buffering1000.out:Throughput: 3212.97")
#HERESTRING and different separator
grep -Eo '(\d+\.\d*|\.\d+|\d+)' <<< "bench-100-net-buffering1000.out:Throughput: 3212.97" | paste -sd, -
#process substitution.. ;)
paste -sd ' ' <(grep -Eo '(\d+\.\d*|\.\d+|\d+)' <<< "bench-100-net-buffering1000.out:Throughput: 3212.97")

与上面的多个文件相同,使用bash循环。在示例中ff*用于文件名。

#Using null-term find
while IFS= read -r -d '' file; do
        grep -Eo '(\d+\.\d*|\.\d+|\d+)' "$file" | paste -s -
done < <(find . -maxdepth 1 -type f -name ff\* -print0)

# or alternative - also prints filenames
while IFS= read -r -d '' file; do
        echo "$file:" $(grep -Eo '(\d+\.\d*|\.\d+|\d+)' $file)
done < <(find . -maxdepth 1 -type f -name ff\* -print0)

echo Using FOR loop
for file in ff* ; do
        grep -Eo '(\d+\.\d*|\.\d+|\d+)' "$file" | paste -s -
done

perl变体:

perl -0777 -nE 'say "@{[/(\d+\.\d*|\.\d+|\d+)/g]}"' ff*

还打印文件名

perl -0777 -nE 'say "$ARGV @{[/(\d+\.\d*|\.\d+|\d+)/g]}"' ff*

也可以通过使用不同的字段分隔符 \t

perl -0777 -nE '$"="\t";say "$ARGV @{[/(\d+\.\d*|\.\d+|\d+)/g]}"' ff*

所有perl解决方案都使用婴儿车操作员通常不建议将其用于生产代码,但对于单行代码是可接受的。

演示:

perl -0777 -nE 'say "@{[/(\d+\.\d*|\.\d+|\d+)/g]}"' <<< "some-111-decimal-222.-another-333.33-only-frac-.444.txt"

输出

111 222. 333.33 .444

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在同一行上通过逗号输出多个正则表达式匹配项

正则表达式匹配同一行上的多个字符串

Java的正则表达式:在同一行捕获多个匹配

正则表达式匹配同一行中的多个值

如何使用正则表达式在一行中匹配多个 SSN

Sed - 如何匹配正则表达式组并使用它来替换同一行中的所有其他匹配项?

从同一行中的两个不同模式打印匹配的正则表达式值

Powershell中的多个正则表达式匹配-在同一行中具有添加内容的输出

使用多个正则表达式:按显示顺序一次打印一个匹配项

将正则表达式匹配从行移动(或复制)到同一行的开头

grep在同一行中包含2个正则表达式

正则表达式仅与同一行匹配

正则表达式:匹配多行模式,直到再次出现同一行

匹配同一行分号后字符的正则表达式

如果在同一行,则正则表达式不匹配

正则表达式匹配重复词-同一行用空格分隔

Python正则表达式:在一行而不是列表中返回匹配项?

grep 正则表达式匹配仅当一行不以

使用正则表达式查找多个匹配项

正则表达式匹配每一行

正则表达式匹配最后一行

使用一个或多个单词作为搜索关键字匹配一行的正则表达式

一行中的多个正则表达式

如何使用正则表达式在一行字符串中匹配多个元素

如何使用正则表达式在同一行上捕获可变数量的模式?

JavaScript正则表达式在一行上时匹配XML关闭标记

如何使用正则表达式为一个属性查找多个匹配项?

正则表达式在一行上分隔多个项目

如何使用正则表达式仅匹配第一行?