在unix上使用命令行修改sql文件

时间:2009-11-26 13:50:58

标签: regex linux command-line-interface

我有一个.sql文件需要稍微调整,特别是:

[xx_blah]

上述任何模式都需要更改为:

[布拉赫]

即。删除xx_prefix和大写下一个字符。

任何提示?

3 个答案:

答案 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,而不是您想要的。排除右括号和下划线是安全措施。

替换中的\uescape 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