在Linux Shell脚本中使用正则表达式解析字符串的正确方法是什么?我编写了以下脚本,使用curl和在控制台上打印我的SO代表sed(不仅仅因为我代表rep -crazy-我试图在切换到Linux之前学习一些Shell脚本和regex)。
curl
sed
json=$(curl -s http://stackoverflow.com/users/flair/165297.json) echo $json | sed 's/.*"reputation":"\([0-9,]\{1,\}\)".*/\1/' | sed s/,//
但是我觉得这sed不是在这里使用的适当工具。我听说这grep与正则表达式有关,并进行了一些探讨。但是很明显,只要找到匹配项,它就会打印整行- 我正试图从一行文本中提取一个数字。这是我正在处理的字符串的缩小版本(由返回curl)。
grep
{“ displayName”:“ Amarghosh”,“声誉”:“ 2,737”,“ badgeHtml”:“ \ u003cspan title = \” 1个银色徽章\“ \ u003e \ u003cspan class = \” badge2 \“ \ u003e● \ u003c / span \ u003e \ u003cspan class = \“ badgecount \” \ u003e1 \ u003c / span \ u003e \ u003c / span \ u003e“}
我想我的问题是:
该grep命令将从许多行中选择所需的行,但不会直接操纵该行。为此,您可以sed在管道中使用:
someCommand | grep 'Amarghosh' | sed -e 's/foo/bar/g'
或者,awk(或perl如果可用)可以使用。它比sed我认为功能强大得多。
awk
perl
someCommand | awk '/Amarghosh/ { do something }'
对于简单的文本操作,只需坚持使用该grep/sed组合键即可。当您需要更复杂的处理时,请移至awk或perl。
grep/sed
我的第一个想法是只使用:
echo '{"displayName":"Amarghosh","reputation":"2,737","badgeHtml"' | sed -e 's/.*tion":"//' -e 's/".*//' -e 's/,//g'
这样可以将sed进程数保持为1(您可以使用发出多个命令-e)。
-e