简化 sed 表达式以将文件中的一行的一部分保存到变量中 (bash)

简化 sed 表达式以将文件中的一行的一部分保存到变量中 (bash)

我正在编写一个 bash 脚本,它将隔离字符串的一部分并将其保存到 bash 脚本中的变量中。假设$INSTALL_INFO我希望从中提取数据的文件是一个变量,我正在做这样的事情。

 BOOST=`cat $INSTALL_INFO | grep 'BOOST:' | sed 's/BOOST://g' | sed 's/^[ \t]*//'`

在这种情况下,boost 是我正在寻找的关键字。文件中项目的格式为:

<possible whitespace><exact title><indeterminate whitespace><data I want><possible whitespace>

必须有一种更简洁的方法来使用一个 sed 命令来完成此操作,但我无法弄清楚任何事情。

答案1

解决此问题的方法是使用sed -n,它只会打印与表达式匹配的行,以及描述整行的一个表达式,仅保留您想要的部分。

BOOST=$(sed -n 's/^.*BOOST:[ \t]*\([^ \t]*\).*$/\1/p' $INSTALL_INFO)

尾部/p告诉sed打印该行(在执行替换之后)。

如果你的“我想要的数据”本身可以包含空格,那就有点棘手了。您必须修改表达式以“咀嚼”行尾的空格。我会切换到 Perl 以便能够使用它的“不情愿”修饰符(?在重复运算符之后):

BOOST=$(perl -ne 'print if s/^.*BOOST:\s*(.*?)\s*$/\1/' install_info.txt)

当然,使用 Perl,您可以只打印匹配的部分,而不用修改该行:

BOOST=$(perl -ne 'print $1 if /BOOST:\s*(.*?)\s*$/' install_info.txt)

相关内容