一尘不染

在Shell脚本中使用正则表达式

linux

在Linux
Shell脚本中使用正则表达式解析字符串的正确方法是什么?我编写了以下脚本,使用curl和在控制台上打印我的SO代表sed(不仅仅因为我代表rep
-crazy-我试图在切换到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与正则表达式有关,并进行了一些探讨。但是很明显,只要找到匹配项,它就会打印整行-
我正试图从一行文本中提取一个数字。这是我正在处理的字符串的缩小版本(由返回curl)。

{“ 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“}

我想我的问题是:

  • 在Linux Shell脚本中使用正则表达式解析字符串的正确方法是什么?
  • 就是sed在这里使用了正确的事情?
  • 可以使用grep吗?
  • 还有其他更简单/更合适的命令吗?

阅读 497

收藏
2020-06-07

共1个答案

一尘不染

grep命令将从许多行中选择所需的行,但不会直接操纵该行。为此,您可以sed在管道中使用:

someCommand | grep 'Amarghosh' | sed -e 's/foo/bar/g'

或者,awk(或perl如果可用)可以使用。它比sed我认为功能强大得多。

someCommand | awk '/Amarghosh/ { do something }'

对于简单的文本操作,只需坚持使用该grep/sed组合键即可。当您需要更复杂的处理时,请移至awkperl

我的第一个想法是只使用:

echo '{"displayName":"Amarghosh","reputation":"2,737","badgeHtml"'
    | sed -e 's/.*tion":"//' -e 's/".*//' -e 's/,//g'

这样可以将sed进程数保持为1(您可以使用发出多个命令-e)。

2020-06-07