Shell脚本中SED命令使用问题:文本处理后变量为空
解决SED不生效与变量为空的Shell脚本问题
让我来帮你排查这两个问题,其实都是Shell脚本里的常见小坑:
问题1:SED命令未生效的原因
你的SED正则表达式和文件内容完全不匹配:
- 你写的是
HELLO(全大写),但文件里的目标字符串是Hello(首字母大写),大小写不匹配导致无法命中 - 正则里的
'[^']*'部分是用来匹配单引号包裹的内容,但你的文件行里根本没有单引号,这部分完全多余
正确的正则应该是匹配 Hello(注意前面的空格)开头到行尾的所有内容,替换为空,也就是:
sed "s/ Hello.*//"
如果想兼容不同大小写的Hello(比如HELLO/hello),可以加i修饰符(GNU sed支持):
sed "s/ hello.*//i"
问题2:变量commitid为空的原因
你给变量赋值的写法完全错误:
commitid=$line | sed "s/ HELLO.*'[^']*'/ /"
这种写法会把$line的值作为命令执行(而不是传给SED处理),同时管道左边的赋值操作不会输出任何内容,SED处理的是空输入,最终commitid自然是空值。
正确的做法是用命令替换($(...))捕获SED的输出,赋值给变量:
commitid=$(echo "$line" | sed "s/ Hello.*//")
这里用"$line"包裹是为了保留行内的空格,避免被Shell拆分。
修正后的完整脚本
file=commit.txt while IFS= read -r line do commitid=$(echo "$line" | sed "s/ Hello.*//") echo "$commitid" # 输出处理后的内容 done < "$file"
额外优化点:
- 加上
read -r可以避免反斜杠被转义,处理特殊字符更安全 - 用
"$commitid"包裹输出,防止行首/行尾的空格被忽略
测试结果
用你提供的commit.txt内容:
dummy statement Hello world dummy 1 statement Hello Mike
执行脚本后会输出:
dummy statement dummy 1 statement
完全符合你的期望。
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

