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:当然,我会添加一个答案