Sed Match Number后跟字符串并返回Number

时间:2016-11-08 19:48:32

标签: regex bash sed

您好我有一个包含以下内容的文件:

   7    Y-N2
   8    Y-H
   9    Y-O2

我希望将它与以下sed命令匹配,并在行的开头获取数字:

abc=$(sed -n -E "s/([0-9]*)(^[a-zA-Z])($j)/\1/g" file)

$j是一个变量,完全包含Y-O2Y-H

数字不是亚麻布。

号码后面跟着一封信。

在数字是空格之前。

回显$abc会返回一条白线。

由于

3 个答案:

答案 0 :(得分:2)

这里有很多问题:

  • 有空格,你没有考虑它们
  • ^必须在里面在char类中制作否定字母
  • 您正在使用-n选项,因此您必须使用p命令,否则将无法打印任何内容(此处g选项无效)

工作命令(我已-E更改了-n,因为我的sed版本不支持它,两者都应该有效):

sed -nr "s/ *([0-9]+) +([^a-zA-Z])($j)/\1/p" file

注意:awk似乎更适合这项工作。例如:

awk -v j=$j '$2 == j { print $1 }' file

答案 1 :(得分:2)

Sed对于这项任务似乎过于复杂,但是使用awk你可以写:

awk -vk="$var" '$2==k{print $1}' file

使用-vk="$var"我们将awk变量k设置为$var shell变量的值。

然后,我们使用'filter{command}'语法,其中过滤器$2==k是第二个字段等于变量k。如果匹配,我们会使用{print $1}打印第一个字段。

答案 2 :(得分:1)

试试这个:

abc=$(sed -n "s/^ *\([0-9]*\) *Y-[OH]2*.*/\1/p" file)

<强>说明:

  • ^ *:以任意数量的空格开头的行
  • \([0-9]*\):使用反向引用捕获以下号码
  • *:在任意数量的空格之后
  • Y-[OH]2*:搜索Y-字符串后跟NH,并选择2
  • \1/p:使用\1命令
  • 输出捕获的字符串p