Mac终端sh -c调用单引号转义及sed替换驼峰方法名问题
解决方案
核心问题拆解
- Mac 原生
sed的-i参数要求必须指定备份文件后缀,原地修改且不需要备份的话语法为sed -i '' '替换规则' 文件名 sh -c字符串内的单引号转义规则:在单引号包裹的命令块中,要输出单引号需写成'\''(关闭外层单引号→转义输出单引号→重新打开外层单引号)sh -c的参数传递规则:sh -c '命令'后的第一个参数会赋值给$0,后续参数才对应$1/$2/...,可以传入一个无用占位符(比如_)给$0避免参数错位
修正后的完整命令
awk '{ if ($1 ~ /^Given/) print $0;}' ~/Documents/Sell/SellUITests/BDDLite/Definitions/HasStepDefinitions.swift \ | tr -d "\t" \ | tr -d " " \ | tr -d "," \ | sort -u \ | xargs -I string sh -c 'str=$(echo string); echo ${str#"Given"}' \ | awk '{ print tolower(substr($1,1,1)) substr($1, 2)" "$1 }' \ | xargs -L1 sh -c ' find ~/Documents/Sell/SellUITests/BDDLite/Definitions/ \ -type f \ -name "Given$2.swift" \ -exec sed -i '\'''\'' '\''s/ $1/ given$2/g'\'' {} + ' _
可选优化:简化前置管道
前面多步tr和字符串处理可以合并到同一条awk命令中,减少不必要的管道传递:
awk '/^Given/ { gsub(/[\t ,]/, "", $0) name = substr($0, 6) print tolower(substr(name,1,1)) substr(name,2) " " name }' ~/Documents/Sell/SellUITests/BDDLite/Definitions/HasStepDefinitions.swift \ | sort -u \ | xargs -L1 sh -c ' find ~/Documents/Sell/SellUITests/BDDLite/Definitions/ \ -type f \ -name "Given$2.swift" \ -exec sed -i '\'''\'' '\''s/ $1/ given$2/g'\'' {} + ' _
内容的提问来源于stack exchange,提问作者Mercutio
相关产品推荐
相关产品推荐

