如何提取bash中文件第一行定义的版本字符串

如何提取bash中文件第一行定义的版本字符串,bash,sed,Bash,Sed,我想提取文件第一行中定义的版本字符串 file.txt version=“11.22.33”project=“foo” 这是一个foo项目,版本为“11.22.33”,使用“44.55.66”版本的某种语言编写 我想要一个命令,它只读取文件的第一行并从中提取11.22.33,然后停止 我尝试了variable\u str=$(sed-rn“0,//p”),但这将返回整行,而不仅仅是匹配的模式。您可以试试这个 awk -F "[= ]" 'NR==1 {gsub(/\"/,"",$2);prin

我想提取文件第一行中定义的版本字符串

file.txt

version=“11.22.33”project=“foo”
这是一个foo项目,版本为“11.22.33”,使用“44.55.66”版本的某种语言编写
我想要一个命令,它只读取文件的第一行并从中提取
11.22.33
,然后停止

我尝试了
variable\u str=$(sed-rn“0,//p”)
,但这将返回整行,而不仅仅是匹配的模式。

您可以试试这个

awk -F "[= ]" 'NR==1 {gsub(/\"/,"",$2);print $2}' file.txt
NR
是行数,
-F
表示字段分隔符,在本例中等于空格。如果你想要引号

awk -F "[= ]" 'NR==1 {print $2}' file.txt

首先
head
第一行,第二行提取模式更容易

head -1 file.txt | sed 's#.*version=\(\"[^"]*\"\).*#\1#' 
您可以使用sed的搜索和替换:
偏执论(必须转义)记录了想要的模式(双引号,除双引号外的所有内容,双引号)。替换只是记录的模式(
\1
)。

为什么要生成另一个进程

$: IFS="$IFS=" read x version x < file.txt
$: echo "$version"
"11.22.33"
如果要删除引号,请将
也添加到IFS,并为将产生的空字段指定一个位置。要删除单引号,请添加这些引号,以此类推

$: IFS="$IFS='\"" read x x version x < file.txt
$: echo "$version"
11.22.33
$:IFS=“$IFS=”\“”读取x版本x
head使您只能处理一行,您可以使用sed的
q
命令来执行此操作,例如:
1s/foo/bar/;q
awk-F'''NR==1{print$2}'file.txt
快速提问,只是因为我很好奇。
awk
是否足够聪明,可以在解析完唯一符合其条件的行后退出,或者它会通过读取文件中的所有其余行并检查行号来进行研究?通常不重要,但从技术上讲,该文件可能有几个行百万行……用
exit
很容易解决,就像他在回答中所做的那样,这甚至不需要与行号进行比较,只要你总是想要第一行。:@PaulHodges:通常awk会贯穿整个文件。但是你可以防止这种情况:
awk-F''NR==1{print$2;exit}'file.txt
则不需要
NR==1
;)不过,我喜欢为分隔符传递字符类。既然OP说他不想引用,我就把它和Ed的解决方案混在一起
awk-F“['\“]”“{print$2;exit}”file.txt
我觉得他想要引号。很抱歉,我不想要引号(可以是单引号或双引号)。请用这些信息更新这个问题-也会更新我的答案。。)你在下面的评论中说它可能有两个单引号。有没有可能它没有引号?如果它可能没有引号-
awk-F“[='\']”“{If($3~/[0-9.]+/)打印$3;否则打印$2;退出}”file.txt
$: IFS="$IFS='\"" read x x version x < file.txt
$: echo "$version"
11.22.33
$ awk -F\" '{print $2; exit}' file
11.22.33