Bash脚本读取版本号时出现换行符的原因及解决方法
Bash脚本读取版本号出现多余换行的原因及解决办法
问题场景
我写了一段Bash脚本,目的是从package.xml文件中读取版本号4.29.0,并将其转换为4-29-0格式。
执行cat package.xml | grep version的原始输出如下:
$ cat package.xml | grep version <?xml version="1.0"?> <version>4.29.0</version>
我用这条命令来提取并转换版本号:
VERSION=$(grep "version" package.xml | awk -F '>|<\' '{print $3}' | sed 's/\./-/g')
但执行echo "testing.. $VERSION"后,输出却出现了多余换行:
testing.. 4-29-0
想搞清楚为什么会出现这个换行,以及怎么去掉它,让输出变成testing.. 4-29-0。
原因分析
问题根源在grep "version"这一步:它匹配到了两行内容——XML声明行<?xml version="1.0"?>和真正的版本标签行<version>4.29.0</version>。
当用awk处理时:
- 第一行按分隔符
>和<拆分后,$3是空字符串,所以awk会输出一个空行; - 第二行处理后得到
4-29-0。
最终VERSION变量里包含了「空行+4-29-0」,所以echo的时候就会换行显示。
解决办法
1. 精准匹配版本标签行
直接让grep只匹配包含<version>标签的行,避免抓到XML声明:
VERSION=$(grep "<version>" package.xml | awk -F '>|<\' '{print $3}' | sed 's/\./-/g')
2. 在awk中过滤空输出
如果不想修改grep,可以让awk只输出非空的内容:
VERSION=$(grep "version" package.xml | awk -F '>|<\' '{if ($3 != "") print $3}' | sed 's/\./-/g')
3. 直接清理变量中的换行符
如果已经拿到了带换行的变量,用tr或sed直接删除换行:
# 方法一:在提取时直接处理 VERSION=$(grep "version" package.xml | awk -F '>|<\' '{print $3}' | sed 's/\./-/g' | tr -d '\n') # 方法二:单独清理变量 VERSION=$(echo "$VERSION" | tr -d '\n')
4. 更可靠的XML专用工具(推荐)
如果XML文件格式可能变化,用专门的XML解析工具xmllint会比正则/awk更稳定,避免解析错误:
VERSION=$(xmllint --xpath 'string(//version)' package.xml | sed 's/\./-/g')
内容的提问来源于stack exchange,提问作者lab tester
相关产品推荐
相关产品推荐

