Regex Sed命令通过文件中的正则表达式进行搜索

Regex Sed命令通过文件中的正则表达式进行搜索,regex,bash,sed,grep,regex-group,Regex,Bash,Sed,Grep,Regex Group,我需要从文件中获取一些版本。我的版本文件如下所示: #define MINOR_VERSION_NUMBER 1 我尝试使用sed命令: VERSION_MINOR=`sed -i -e 'MINOR_VERSION_NUMBER\s+\([0-9]+\).*/\1/p' $WORKSPACE/project/common/version.h` 但我得到了一个错误: sed: -e expression #1, char 2: extra characters after comman

我需要从文件中获取一些版本。我的版本文件如下所示:

#define MINOR_VERSION_NUMBER    1
我尝试使用sed命令:

VERSION_MINOR=`sed -i -e 'MINOR_VERSION_NUMBER\s+\([0-9]+\).*/\1/p' $WORKSPACE/project/common/version.h`
但我得到了一个错误:

sed: -e expression #1, char 2: extra characters after command

对于任何X,选择匹配行的地址需要包含在/../或\X…X中

sed -ne '/MINOR_VERSION_NUMBER/{ s/.*\([0-9]\).*/\1/;p }' 
不要使用-i,它会就地更改文件,并且不会输出任何内容

更常见的方法是使用awk查找行并提取所需列:

awk '(/MINOR_VERSION_NUMBER/){print$3}'
使用grep

grep MINOR_VERSION_NUMBER  | grep -o '[0-9]*$' 
演示:

$echo "#define MINOR_VERSION_NUMBER    1"  |  grep -o '[0-9]*$' 
1
$echo "#define MINOR_VERSION_NUMBER    1123"  |  grep -o '[0-9]*$'
1123
$

这是对你尝试的更正。更改您的线路:

VERSION_MINOR=`sed -i -e 'MINOR_VERSION_NUMBER\s+\([0-9]+\).*/\1/p' $WORKSPACE/project/common/version.h`
进入:

使用GNU sed的-r选项可以使其更具可读性:

正如choroba所说,awk比sed更适合这种处理方式——见他的答案

但是,下面是另一个使用bash的read内置和GNU grep的解决方案:

read x x VERSION_MINOR x < <(grep -F -w -m1 MINOR_VERSION_NUMBER $WORKSPACE/project/common/version.h)

是否确实要修改.h版本文件?如果没有,不要用-i.i不明白。当我使用/MINOR\u VERSION\u NUMBER/时,我会将整个文件作为result@Kucharsky这是因为sed默认打印整个文件。sed不是从文件中选择零件的工具,它是一个文件编辑器。grep和awk等工具对文件进行操作,并可以执行更多选择区域中的各种操作。使用sed,默认情况下需要-n来禁止打印每一行。然后,您需要一个p命令来显式地告诉它何时打印。您可以先对该行进行s///编辑。如果定义行以注释或额外空格结尾,则此操作将失败。choroba的答案在这方面更好。答案基于用户提供的输入。你能保证版本号后不会有不可见的额外空间吗?开发人员不是防错的。尤其是当这不是一个错误时。
VERSION_MINOR=`sed -n -r -e '/^#define\s+MINOR_VERSION_NUMBER\s+([0-9]+).*/ s//\1/p' $WORKSPACE/project/common/version.h`
read x x VERSION_MINOR x < <(grep -F -w -m1 MINOR_VERSION_NUMBER $WORKSPACE/project/common/version.h)
VERSION_MINOR=$(echo "#define MINOR_VERSION_NUMBER    1" | tr -s ' ' | cut -d' ' -f3)