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)