使用linux脚本中的正则表达式解析字符串的正确方法是什么?我编写了下面的脚本,使用curl和sed在控制台上打印我的some (不仅仅是因为我的代表疯了--在切换到linux之前,我正在尝试学习一些shell脚本和regex )。
json=$(curl -s http://stackoverflow.com/users/flair/165297.json)
echo $json | sed 's/.*"reputation":"\([0-9,]\{1,\}\)".*/\1/' | sed s/,//但不知何故,我觉得sed不是这里使用的合适工具。我听说grep完全是关于regex的,并对其进行了一些探索。但很明显,每当找到匹配时,它就会打印整条线--我正试图从一行文本中提取一个数字。下面是我正在处理的字符串的缩小版本(由curl返回)。
{"displayName":"Amarghosh",“名誉”:“2,737”,"badgeHtml":"\u003cspan title=\"1枚银徽章\\u003E\u003cspan displayName
我想我的问题是:
sed是正确的吗?grep来完成吗?发布于 2009-10-28 10:28:58
grep命令将从许多行中选择所需的行,但它不会直接操作行。为此,在管道中使用sed:
someCommand | grep 'Amarghosh' | sed -e 's/foo/bar/g'或者,可以使用awk (如果可用的话也可以使用perl )。在我看来,这是一个比sed强大得多的文本处理工具。
someCommand | awk '/Amarghosh/ { do something }'对于简单的文本操作,只需使用grep/sed组合即可。当您需要更复杂的处理时,请继续使用awk或perl。
我的第一个想法就是用:
echo '{"displayName":"Amarghosh","reputation":"2,737","badgeHtml"'
| sed -e 's/.*tion":"//' -e 's/".*//' -e 's/,//g'这使得sed进程的数量保持在一个(您可以使用-e提供多个命令)。
发布于 2009-10-28 10:52:16
您可能对将Perl用于此类任务感兴趣。作为一个演示,下面是一个Perl脚本,它打印您想要的数字:
#!/usr/local/bin/perl
use warnings;
use strict;
use LWP::Simple;
use JSON;
my $url = "http://stackoverflow.com/users/flair/165297.json";
my $flair = get ($url);
my $parsed = from_json ($flair);
print "$parsed->{reputation}\n";此脚本要求您安装JSON模块,只需使用命令cpan JSON即可。
发布于 2009-10-28 10:56:41
为了在shell脚本中使用JSON,可以使用爪哇,它喜欢awk,但是对于JSON。
json=$(curl -s http://stackoverflow.com/users/flair/165297.json)
echo $json | jsawk 'return this.reputation' # 2,747https://stackoverflow.com/questions/1636352
复制相似问题