1

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

[xx_blah]

像上面这样的任何模式都需要更改为:

[废话]

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

有小费吗?

4

3 回答 3

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替换中的 是一个转义序列,将以下字母大写。

如果您更喜欢 sed 并且您的眼睛不会从所有反斜杠上穿过,请选择

$ sed -e 's/\[[^]_]\+_\(.\+\?\)]/[\u\1]/g' old.sql > new.sql
于 2009-11-26T13:54:01.623 回答
1
sed -e 's/xx_\([a-z]\)/\u\1/' < old.sql > new.sql
于 2009-11-26T13:59:38.507 回答
0

您无需外部工具即可使用外壳

#!/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
于 2009-11-26T15:15:24.457 回答