如何提取bash中文件第一行定义的版本字符串
我想提取文件第一行中定义的版本字符串 file.txt如何提取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
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