[英]Sed command to search by regex in file
我需要從文件中獲取多個版本。 我的版本文件如下所示:
#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
X)。
sed -ne '/MINOR_VERSION_NUMBER/{ s/.*\([0-9]\).*/\1/;p }'
不要使用-i
,它會更改文件並且不會 output 任何東西。
更常見的方法是使用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`
進入:
VERSION_MINOR=`sed -n -e '/^#define\s\+MINOR_VERSION_NUMBER\s\+\([0-9]\+\).*/ s//\1/p' $WORKSPACE/project/common/version.h`
使用 GNU sed
的-r
選項可以使這更具可讀性:
VERSION_MINOR=`sed -n -r -e '/^#define\s+MINOR_VERSION_NUMBER\s+([0-9]+).*/ s//\1/p' $WORKSPACE/project/common/version.h`
正如 choroba 所說,awk 比 sed 更適合這種處理(見他的回答)。
然而,這里是另一個使用 bash 的read
builtin 以及 GNU grep 的解決方案:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.