匹配一个字符串,该字符串可以在其中的任何位置使用换行符--bash

时间:2014-01-22 22:10:51

标签: regex bash sed awk

我有一个包含数字的字符串,表示如下:

\S2=number_goes_here\

该号码可以是0.00000及以上的任何内容。但是,该字符串中的任何地方都可能有换行符,我不完全确定如何匹配它。最终,我只想要这个数字。重要的是,这个字符串位于一大块文本中,可以用这个样本表示(S2在最后一行找到):

 1.454187\H,0,0.719618,3.525801,1.633708\H,0,-0.454651,2.80328,2.23844\
 Ru,0,0.025774,1.557599,-0.253913\\Version=EM64L-G09RevD.01\State=6-A\H
 F=-1238.5377983\S2=8.75446\S2-1=0.\S2A=8.750006\RMSD=2.314e-09\Dipole=

我愿意接受bash,sed,awk,gawk;无论你有什么想法来解决这个问题。

编辑:

以下是示例,下面的第一个答案对于此示例似乎没有正常工作。它只打印“2”。

 .631441,-2.132979\H,0,0.20151,-1.464802,-2.95553\H,0,0.377883,-2.50668
 5,-1.874761\\Version=EM64L-G09RevD.01\State=3-A\HF=-1265.9035096\S2=2.
 053325\S2-1=0.\S2A=2.000966\RMSD=1.590e-04\Dipole=0.7197616,-2.1253769

4 个答案:

答案 0 :(得分:5)

grep -Po '(?<=S2=)[\d.]+' <(tr -d '\n' < file)

给出

8.75446

答案 1 :(得分:2)

您可以使用,以slurp模式读取整个文件,删除换行符并使用正则表达式进行搜索:

perl -0777 -nE '
  $_ = join q||, split /\n/; 
  printf qq|%s\n|, $1 if m/\\S2=([\d.]+)/
' infile

它产生:

8.75446

答案 2 :(得分:0)

也可以使用bash,虽然这对于非常大的文件来说不会很好。

#!/bin/bash
IFS=$'\n'
string=$(<"test.txt")
var=$(echo $string) # word-splitting will replace each newline with a space here

while IFS= read -r word; do
  [[ $word =~ '\S2='([0-9]*\.[0-9]*)'\'  ]] && echo ${BASH_REMATCH[1]}
done <<< "$var"

e.g。

> ./abovescript 
8.75446

答案 3 :(得分:0)

以下是gnu awk版本(由于RS有多个字符):

awk -F'\' 'NR==2 {print $1}' RS="S2=" file
8.75446

适用于大多数awk

的版本
awk -F\\ '{for (i=1;i<=NF;i++) if ($i~/S2=/) {split($i,a,"=");print a[2]}}' file
8.75446