我有一个需要稍微调整的 .sql 文件,特别是:
[xx_blah]
像上面这样的任何模式都需要更改为:
[废话]
即删除 xx_prefix 和大写的下一个字符。
有小费吗?
我有一个需要稍微调整的 .sql 文件,特别是:
[xx_blah]
像上面这样的任何模式都需要更改为:
[废话]
即删除 xx_prefix 和大写的下一个字符。
有小费吗?
简单blah
替换:
$ sed -e 's/\[[^]]*_blah]/[Blah]/g' old.sql > new.sql
更一般的:
$ perl -pe 's/\[[^]_]+_(.+?)]/[\u$1]/g' old.sql > new.sql
匹配前缀与[^]_]+
而不是.+
正则表达式量词的原因是贪婪的。例如,后者在[xx_blah][xx_blah]
作为输入给出时会尽可能多地吞噬并匹配xx_blah][xx
,而不是你想要的。排除右括号和下划线是安全停止。
\u
替换中的 是一个转义序列,将以下字母大写。
如果您更喜欢 sed 并且您的眼睛不会从所有反斜杠上穿过,请选择
$ sed -e 's/\[[^]_]\+_\(.\+\?\)]/[\u\1]/g' old.sql > new.sql
sed -e 's/xx_\([a-z]\)/\u\1/' < old.sql > new.sql
您无需外部工具即可使用外壳
#!/bin/bash
declare -a arr
while read -r -a arr
do
for((i=0;i<=${#arr};i++))
do
case "${arr[i]}" in
*"[xx_"* );;&
*"["*)
arr[i]=${arr[i]//xx_/}
arr[i]=${arr[i]^^${arr[i]:1:1}}
esac
done
echo ${arr[@]}
done < "file"
运行时的输出示例
PS1> more file
this is first line
this is second line
[xx_blah]
this is fourth line
blah [xx_blah] blah [xx_blah]
[someText]
end
PS1> ./mychanger.sh
this is first line
this is second line
[Blah]
this is fourth line
blah [Blah] blah [Blah]
[SomeText]
end