【问题标题】:Parsing multi-line variables using grep使用 grep 解析多行变量
【发布时间】:2016-03-01 13:14:50
【问题描述】:

我试图弄清楚为什么这不起作用,当然还有如何解决它,我在一个变量中有一个很长的日期列表,并且想使用 grep 来计算出现的次数,这似乎是拆分一个变量在新线路上没有按预期工作?例如,

$ list="2015-a 2015-b 2016-a" ; count=`echo $list | tr " " \\n | grep 2015 | wc -l` ; echo $count
1


$ list="2015-a,2015-b,2016-a" ; count=`echo $list | tr , \\n | grep 2015 | wc -l` ; echo $count
1


$ list="2015-a,2015-b,2016-a" ; count=`echo $list | sed s/,/\\n/g | grep 2015 | wc -l` ; echo $count
1

有什么想法吗?

【问题讨论】:

  • echo "2015-a 2015-b 2016-a" |grep -o "2015" | wc -l
  • 如果你说tr " " "\n"就可以了。
  • 顺便说一句,对于那些检查这个问题的人:有一个同义词请求将tr 合并到html-table。投票否决! stackoverflow.com/tags/html-table/synonyms 更多信息在 [我们可以撤消使 [tr] 成为 [html-table] 的同义词的建议吗?](meta.stackoverflow.com/q/311194/1983854)
  • 只需使用grep -o 2015,您就会在同一行中多次出现
  • 非常感谢您向我介绍 grep -o !

标签: linux bash sed grep tr


【解决方案1】:

问题在于反引号解释\\的方式:

反引号内的反斜杠 () 以不明显的方式处理:

  $ echo "`echo \\a`" "$(echo \\a)"
  a \a
  $ echo "`echo \\\\a`" "$(echo \\\\a)"
  \a \\a
  # Note that this is true for *single quotes* too!
  $ foo=`echo '\\'`; bar=$(echo '\\'); echo "foo is $foo, bar is $bar" 
  foo is \, bar is \\

所以不要说:

$ echo "`echo $list | tr " " \\n`"
2015-an2015-bn2016-a

你不得不说:

$ echo "`echo $list | tr " " \\\\n`"
2015-a
2015-b
2016-a

即使最好使用$(),因为反引号已被弃用:

$ echo "$(echo $list | tr " " '\n')"
2015-a
2015-b
2016-a

如果您仍想使用反引号,最干净的解决方案是使用" " 作为包装器,而不是使用这样的\\\\ 转义:

$  echo "`echo $list | tr " " "\n"`"
2015-a
2015-b
2016-a

所有这些都可以在Why is $(...) preferred over ... (backticks)?阅读。


总而言之,如果您只想计算有多少单词包含 2015,您可以考虑使用 cmets 中建议的 grep -o,或者像 awk 这样更强大的东西:

awk '{for (i=1;i<=NF;i++) if ($i~2015) count++; print count}'

看一些例子:

$ awk '{for (i=1;i<=NF;i++) if ($i~2015) s++; print s}' <<< "2015-a 2015-b 2016-a"               2
$ awk '{for (i=1;i<=NF;i++) if ($i~2015) s++; print s}' <<< "2015-a 2015-b 2016-a 20152015-c"
3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 2019-03-08
    • 2016-05-05
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多