如何使用循环链式串联管道命令,构建文本替换处理命令?
解决方法
最优方案:合并所有sed替换规则(推荐)
你不需要生成多个独立sed命令再用管道串联——这种方式会让文件被多次读取,效率很低。更好的做法是把所有替换规则整合到单个sed命令里,只需要读取一次文件就能完成所有替换:
elements="A B C D" n=1 sed_cmd="" for i in $elements; do sed_cmd+="-e 's/$i/$n/g' " n=$((n+1)) done # 执行整合后的命令 cat example.txt | sed $sed_cmd
或者更简洁的写法,用分号分隔替换规则:
elements="A B C D" n=1 sed_rules="" for i in $elements; do sed_rules+="s/$i/$n/g;" n=$((n+1)) done # 可选:去掉末尾多余的分号(sed允许末尾保留分号) sed_rules=${sed_rules%?} cat example.txt | sed "$sed_rules"
执行后会直接输出:
1 2 3 4
如果一定要用管道串联多个sed命令
如果你坚持要生成链式管道命令,可以通过逐步构建命令字符串的方式实现,但这种方法效率不如合并sed,仅作参考:
elements="A B C D" # 初始化基础命令 cmd="cat example.txt" n=1 for i in $elements; do cmd+=" | sed 's/$i/$n/g'" n=$((n+1)) done # 执行构建好的命令 eval "$cmd"
注意:如果elements里包含空格、引号这类特殊字符,eval可能会引发安全问题,所以优先推荐第一种合并sed的方案。
内容的提问来源于stack exchange,提问作者GaBe
相关产品推荐
相关产品推荐

