【问题标题】:Extract number of text file using bash使用 bash 提取文本文件的数量
【发布时间】:2018-06-03 18:22:45
【问题描述】:

我有一个带有以下字符串的变量作为输入:

x}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:>12,34 M<.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important} </style><style>body,td,a,p,.h{font-family:arial,sans-serif}body{margin:0;overflow-y:scroll}#gog{padding:3px 8px 0}td{line-height:.8em}.gac_m td{line-height:17px}form{margin-bottom:20px}.h{color:#36c}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}em{font-weight:bold;font-style:normal}.lst{height:25px;width:496px}.gsfi,.lst{font:18px arial,sans-serif}.gsfs{font:17px arial,sans-serif}.ds{display:inline-box;display:inline-block;margin:3px 0 4px;margin-left:4px}input{font-family:inherit}a.gb1,a.gb2,a.gb3,a.gb4{color:#11c !important}body{background:#fff;color:black}a{color:#11c;text-decoration:none}a:hover,a:active{text-decoration:underline}.fl a{color:#36c}a:visited{color:#551a8b}a.gb1,a.gb4{text-decoration:underline}a.gb3:hover{text-decoration:none}#ghead a.gb2:hover{color:#fff !important}.sblc{padding-top:5px}.sblc a{display:block;margin:2px 0;margin-left:13px;font-size:11px}.lsbb{background:#eee;border:solid 1px;border-color:#ccc #999 #999 #ccc;height:30px}.lsbb{display:block}.ftl,#fll a{display:inline-block;margin:0 12px}.lsb{background:url(/images/nav_logo229.png) 0 -261px repeat-x;border:none;color:#000;cursor:pointer;height:30px;margin:0;outline:0;

我们可以在字符串中的某处找到:

>12,34 M<

能不能把数字12,34提取出来放到一个变量里面?

我有几个这样的字符串,但是模式 >number M

感谢您的建议:)

【问题讨论】:

    标签: string bash shell substring


    【解决方案1】:

    您可以尝试读取输入变量以使用 grep Regex

    echo $variable | grep -Eo "[0-9,]{1,} M"   
    

    参见 cmets:使用 &lt;&lt;&lt; 避免使用 echo 并分配给变量:

    finalVar=$(grep -Eo '[0-9,]{1,} M' <<< "$variable") 
    

    【讨论】:

    • 不错的解决方案。我不知道为什么人们会避免使用这里的字符串。因此,使用 here-strings 您可以使用 grep -Eo '[0-9,]{1,} M' &lt;&lt;&lt; "$variable" 但这可能是个人喜好问题。我要说的另一件事是您的答案不完整,因为它没有分配给变量。不要以为提出要求的人总是知道这样做。
    • 你说得对,我确实使用了 here-string 但没有想到,所以正确的答案应该是 finalVar=$(grep -Eo '[0-9,]{1 ,} M'
    • 为了更好的修复(匹配 &lt;&gt; 和最多 1 个 [,]),请使用 finalVar=$(grep -Eo '&gt;[0-9]{1,}[,]{0,1}[0-9]{0,} M&lt;' | tr -d '&lt;&gt;' &lt;&lt;&lt; "${variable}"
    【解决方案2】:

    当你在每一行都有模式时,使用

    resultvar=$(sed -r 's/.*>([0-9]+[,]{0,1}[0-9]+ M)<.*/\1/' <<< "$variable") 
    

    当您的输入超过 1 行且只有一个匹配项时,请使用

    resultvar=$(sed -nr 's/.*>([0-9]+[,]{0,1}[0-9]+ M)<.*/\1/p' <<< "$variable") 
    

    当您可以有多个匹配时,请指定所需的结果(仅第一个或最后一个匹配、一个数组、一组变量或一条错误消息)。

    【讨论】:

    • 为什么使用{1,} 而不是+ 等?
    • @PesaThe 你说得对,我把{1,} 改成了+。我不确定接下来的哪个数字是有效的,所以我给出了一个简单的解决方案:11,;,2.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多