Regex Sed匹配号后跟字符串和返回号

Regex Sed匹配号后跟字符串和返回号,regex,bash,sed,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-O2或Y-H 该编号不是行号 数字后面总是跟一个字母 数字前面是空格 回显$abc返回一条白线 谢谢这里有很多问题: 有空格,你不需要解释 ^必须在char类中才能生成负号 您使用的是-n选项,因

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

   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-O2或Y-H

该编号不是行号

数字后面总是跟一个字母

数字前面是空格

回显$abc返回一条白线

谢谢这里有很多问题:

有空格,你不需要解释 ^必须在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
这里有很多问题:

有空格,你不需要解释 ^必须在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

Sed对于此任务来说似乎过于复杂,但使用awk您可以编写:

awk -vk="$var" '$2==k{print $1}' file
使用-vk=$var,我们将awk变量k设置为$var shell变量的值


然后,我们使用'filter{command}'语法,其中filter$2==k表示第二个字段等于变量k。如果有匹配项,我们将使用{print$1}打印第一个字段。

Sed对于此任务来说似乎过于复杂,但使用awk,您可以编写:

awk -vk="$var" '$2==k{print $1}' file
使用-vk=$var,我们将awk变量k设置为$var shell变量的值

然后,我们使用'filter{command}'语法,其中filter$2==k表示第二个字段等于变量k。如果有匹配项,我们将使用{print$1}打印第一个字段。

尝试以下操作:

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

^*:在以任意数量的空格开头的行中 \[0-9]*\:使用反向引用捕获以下数字 *:在任意数量的空格之后 Y-[OH]2*:搜索Y字符串,后跟N或H,可选2 \1/p:捕获的字符串\1通过p命令输出 试试这个:

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

^*:在以任意数量的空格开头的行中 \[0-9]*\:使用反向引用捕获以下数字 *:在任意数量的空格之后 Y-[OH]2*:搜索Y字符串,后跟N或H,可选2 \1/p:捕获的字符串\1通过p命令输出
为什么要使用sed呢?使用awk,您只需执行awk-vk=$var'$2==k{print$1}'文件预期输出是abc中保存的数字。@user000001您能解释一下打印前的-vk和k吗?@Thunfisch:当然,我会补充一个答案为什么要使用sed?使用awk,您只需执行awk-vk=$var'$2==k{print$1}'文件预期输出是abc中保存的数字。@user000001您能解释打印前的-vk和k吗?@Thunfisch:当然,我会添加一个答案