我有一个.sql文件需要稍微调整,特别是:
[xx_blah]
上述任何模式都需要更改为:
[布拉赫]
即。删除xx_prefix和大写下一个字符。
任何提示?
答案 0 :(得分:3)
简单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
是escape sequence,它会使下面的字母大写。
如果您更喜欢sed,并且您的眼睛没有从所有反斜杠穿过,请使用
$ sed -e 's/\[[^]_]\+_\(.\+\?\)]/[\u\1]/g' old.sql > new.sql
答案 1 :(得分:1)
sed -e 's/xx_\([a-z]\)/\u\1/' < old.sql > new.sql
答案 2 :(得分:0)
你可以在没有外部工具的情况下使用shell
#!/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