簡體   English   中英

Sed 命令通過文件中的正則表達式搜索

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM