关于shell:如何使用sed提取字符串

How to use sed to extract a string

我需要从命令的输出中提取一个数字:cmd。输出为type: 1000。所以我的问题是如何执行命令,将其输出存储在变量中,并在shell脚本中提取1000。另外,如何将提取的字符串存储在变量中?


您将您的问题标记为sed,但您的问题描述并不限制其他工具,因此这里有一个使用awk的解决方案。

1
output = `cmd | awk -F':' '/type: [0-9]+/{print $2}'`

或者,您可以使用更新的$( )语法。有些人认为较新的语法更可取,并且可以方便地嵌套,而不需要转义backtics。

1
output = $(cmd | awk -F':' '/type: [0-9]+/{print $2}')


这个问题以前曾在这里被分块回答过,应该是这样的:

1
2
3
4
5
6
7
line=$(sed -n '2p' myfile)
echo"$line"


if [ `echo $line || grep 'type: 1000' ` ] then;
  echo"It's there!";
fi;

将SED的输出存储到变量中

bash中包含的字符串

编辑:SED非常有限,您需要使用bash、perl或awk来满足您的需要。


这是grep的典型用例:

1
output=$(cmd | grep -o '[0-9]\+')

您可以使用所谓的命令替换将命令的输出甚至命令管道写入shell变量:

1
variable=$(cmd);

在评论中,似乎cmd的输出比type : 1000包含更多的行。在这种情况下,我建议sed

1
output=$(cmd | sed -n 's/type : \([0-9]\+\)/\1/p;q')


下面是一个简单的SED解决方案,它使用Regular表达式查找字符串中的数字:

1
cmd | sed 's/^.*type: \([0-9]\+\)/\1/g'
  • ^表示从一开始
  • .*可以是任何字符(也可以是无字符)
  • \([0-9]\+\)是数字(至少一个字符)
  • \1表示它采用它找到的第一个模式(并且仅在本例中),并将其用作整个字符串的替换。

如果输出严格限制在"类型:"后面跟一个数字,则只能使用cut

1
var=$(echo 'type: 1000' | cut -f 2 -d ' ')

显然,您必须将命令的输出通过管道传输到cut,我使用echo作为演示。

另外,如果您搜索的字符串更复杂,我会使用grep,然后使用cut。如果我们假设文本中可以有所有类型的数字,但只有一个出现的"类型:"后跟一个数字,则可以使用以下命令:

1
2
3
>> var=$(echo"hello 12 type: 1000 foo 1001" | grep -oE"type: [0-9]+" | cut -f 2 -d ' ')
>> echo $var
1000


可以使用运算符将一个命令的输出发送到另一个命令,如下所示:

1
2
3
4
echo" 1
 2
 3
" | grep"2"

这会将字符串"1 2 3"发送到grep命令,该命令将搜索包含2的行。听起来你可能想做如下的事情:

1
cmd | grep"type"