【问题标题】:Extract Digits From String After Capturing It From File从文件中捕获字符串后从字符串中提取数字
【发布时间】:2013-04-10 14:55:00
【问题描述】:

我正在尝试从文件中检索内存值,并将其与参考值进行比较。但一次只做一件事...... 我尝试使用 set/source/grep/substring 来变量,但它们都没有真正起作用。然后我找到了一种使用 for 循环的方法(参见代码)。 问题:我正在从文件中接收整个字符串,但我无法摆脱其中的最后一个字符。

 #!/bin/bash

 #source start_params.properties
 #mem_val= "$default.default.minmaxmemory.main"
 #mem_val= grep "default.default.minmaxmemory.main" start_params.properties
 for mLine in $(grep 'default.default.minmaxmemory.main' start_params.properties)
  do
    echo "$mLine"
 done
 echo "${mLine:4:5}"  # didn't get rid of the last `m` in `-max4095m`
 v1="max"
 v2="m"
 echo "$mLine" | sed -e "s/.*${v1}//;s/${v2}.*//" #this echo the right value. 

循环迭代两次: 第一个输出:default.default.minmaxmemory.main=-min512m 第二个输出:-max4096m 然后 sed 命令输出是4096,但是如何更改代码 S.T. 中的最后一行?它会将值存储在变量中吗?

感谢您的建议,

【问题讨论】:

  • 使用命令替换:v=$(echo "$mLine" | sed -e "s/.*${v1}//;s/${v2}.*//")。替代方案:如果您只需要删除非数字字符,请使用:v=$(tr -dC '[:digit:]' <<<"$mLine")
  • @mklement 太好了!非常感谢,我用的是后者。
  • 不客气。这是一个可能会派上用场的 bash 备忘单:mywiki.wooledge.org/BashSheet

标签: string bash variables for-loop sed


【解决方案1】:

您可以使用grep 过滤max 部分,然后使用另一个grep -o 来提取数字:

echo "$mLine" | grep "$max" | grep -o '[[:digit:]]*'

【讨论】:

  • grep 命令的略短版本:egrep -o '\d+'
  • 嗨 h3nr1x,谢谢你的建议,但是当我尝试 echo "$mLine" | grep "-max" |grep -o '[[:digit:]]*' grep 不喜欢 max 前面的 - 标志。
  • 当我从max 前面删除- 时,输出与我最初的max4096m 相同
  • @Simply_Me:使用grep -- "-max"-- 告诉 grep 后面的任何内容都不是一个选项。
  • 谢谢你,@h3nr1x - 我很感激。
【解决方案2】:
$ sed '/max[0-9]/!d; s/.*max//; s/m//' start_params.properties
4096
  • 删除与max[0-9]不匹配的行
  • 删除行的第一部分直到max
  • 删除最终m

【讨论】:

  • 嗨@Steven,很抱歉,但这不起作用,因为 max 不是文件中的唯一名称。这就是我首先寻找房产的原因。
猜你喜欢
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多