regex删除前缀,另一个删除第一个字母的大写字母
我需要在这里分两步做:regex删除前缀,另一个删除第一个字母的大写字母,regex,perl,Regex,Perl,我需要在这里分两步做: 用[someText]修改[xx_someText]的所有出现处 使用[someText]修改所有出现的[someText] 我需要在2个正则表达式中使用它,因为有些表名的前缀不是xx\ux 我在一台微软的机器上 我可以访问Unix,但我使用的是GIT bash实用程序,它似乎安装了sed和perl,以防更简单 更新 样本输入: 创建表[dbo]。[xx_属性]( [attributeID][int]不为空, [dateTypeID][tinyint]不为空 应输出为:
xx\ux
我在一台微软的机器上
我可以访问Unix,但我使用的是GIT bash实用程序,它似乎安装了sed和perl,以防更简单
更新
样本输入:
创建表[dbo]。[xx_属性](
[attributeID][int]不为空,
[dateTypeID][tinyint]不为空
应输出为:
创建表[dbo]。[属性](
[AttributeID][int]不为空,
[DateTypeID][tinyint]不为空
注意:值[int]和[tinyint]将变为[int]和[tinyint],这没什么大不了的。对于第一部分,您可以做:
sed 's/xx_\(\w\+\)/\1/' filename
第二部分:
sed 's/\w\+/\u\0/' filename
Awk将此作为一个步骤:
awk '{sub("^xx_", ""); print toupper(substr($0, 1, 1)) substr($0, 2);}'
将项目放在一行上。sub()去掉前缀,然后print语句以大写形式打印剩余的第一个字符,其余字符保持原样。此操作使用GNU sed 4.2.1
sed 's/\[xx_/[/g; s/\[./\U&/g'
仅使用外壳
#!/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"
!/bin/bash
声明-arr
读时-r-a arr
做
对于Perl中的((i=0;i):
#!/usr/bin/perl
while (<>) {
s/\[(?:xx_)?([^]]+)\]/\[\u$1\]/g;
print;
}
这已通过您的示例进行了测试
CREATE TABLE [dbo].[xx_SomeAttribute]( [someAttributeID] [int] NOT NULL, [dateTypeID] [tinyint] NOT NULL
CREATE TABLE [Dbo].[SomeAttribute]( [SomeAttributeID] [Int] NOT NULL, [DateTypeID] [Tinyint] NOT NULL
请注意,括号内的所有文本都会受到影响
perl -pe "s/\[(xx_)?(\w+)\]/'[' . ($1 ? $2 : ucfirst $2) . ']'/ge"
这里使用双引号是因为我的理解是OP在Windows命令行上。有趣的是,一个人可以在没有回答一个问题的情况下积累超过3000名代表…提出好的问题和提供答案一样有价值。这当然与我负责课堂的经验一致,尽管situa卡尔:这肯定是真的。当你问了397个问题时,其中一些肯定是好问题。我确实有一个好问题徽章:)你忘了给我们展示你迄今为止所做的尝试。哈哈,这把问题转化为:[b e a l s p a c e d o o u t]嗯..不起作用,它返回:创建表[dbo]。[xx_SomeAttribute]([someAttributeID][int]NOT NULL,[dateTypeID][tinyint]NOT NULL我完全按照你写的做了,但是做了一个perl-ne'output.sqlOh,那么你应该更新你的问题。你想包括方括号吗?我不太明白,我的问题的输入和输出文本都有方括号,例如[SomeText]在#2中,谢谢!您使用1行程序进行了尝试吗?嗯…我的在win7中使用GIT bash不起作用。谢谢您提醒我关于'-p'。我不习惯使用一行程序。回答很好,但是xx可能不存在,所以应该是:perl-pe's/(?:xx#)?(\w+)/ucfirst$1/ge'。还请注意单引号,因为您不希望shell插入$1。方括号是match alsoyes的一部分,所以?如果OP有,那么它很好。如果没有,还有其他解决方案。是的,所以?有点油嘴滑舌,因为(1)您从未提到您的答案需要非常具体的Bash版本;(2)绝大多数系统都还没有这个版本。奇怪的是,我们中的很多人直到后来才提到Perl、Python、sed或任何软件版本。那么,这里真正的问题是什么呢?你们中的一些人可能很迂腐。WTH
perl -pe "s/\[(xx_)?(\w+)\]/'[' . ($1 ? $2 : ucfirst $2) . ']'/ge"