免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5255 | 回复: 18

[文本处理] 如何将一行中的部分文本格式由CamelWord更改为CAMEL_WORD [复制链接]

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
发表于 2015-01-08 13:24 |显示全部楼层
本帖最后由 欧阳西风 于 2015-01-08 13:24 编辑

现在有一些文本,每一行中都是相同的两个部分,现在想把第一个部分格式由原来的CamelWord的格式更改为CAMEL_WORD的形式。第二部分不变。如下:

处理前:
  1. HelloWorld HelloWorld
  2. DoSomethingSpecial DoSomethingSpecial
  3. EnglishConditionAction EnglishConditionAction
  4. ThisIsASentenceForTesting ThisIsASentenceForTesting
复制代码
处理后:
  1. HELLO_WORLD HelloWorld
  2. DO_SOMETHING_SPECIAL DoSomethingSpecial
  3. ENGLISH_CONDITION_ACTION EnglishConditionAction
  4. THIS_IS_A_SENTENCE_FOR_TESTING ThisIsASentenceForTesting
复制代码
目前在Vim中没找到好的方法。
希望大家能够给个思路,不一定适用vim,可以使用sed/awk等其他命令实现,希望能够找到简单明了的解决方法,谢谢

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-01-08 13:39 |显示全部楼层
回复 1# 欧阳西风

Would you like this

$ perl -lape '$F[0]=~s/([A-Z][a-z]*)/_\U${1}/g;$_="@F";s/^_//' FILE
HELLO_WORLD HelloWorld
DO_SOMETHING_SPECIAL DoSomethingSpecial
ENGLISH_CONDITION_ACTION EnglishConditionAction
THIS_IS_A_SENTENCE_FOR_TESTING ThisIsASentenceForTesting

   

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2015-01-08 13:46 |显示全部楼层
本帖最后由 yinyuemi 于 2015-01-08 14:00 编辑

回复 1# 欧阳西风
  1. echo 'HelloWorld HelloWorld
  2. DoSomethingSpecial DoSomethingSpecial
  3. EnglishConditionAction EnglishConditionAction
  4. ThisIsASentenceForTesting ThisIsASentenceForTesting' |sed ':a;s/\([[:upper:]][[:lower:]]\+\)\(.\+\)\1/\U_\1\E\2\1/;ta;s/_//'
  5. HELLO_WORLD HelloWorld
  6. DO_SOMETHING_SPECIAL DoSomethingSpecial
  7. ENGLISH_CONDITION_ACTION EnglishConditionAction
  8. THIS_ISA_SENTENCE_FOR_TESTING ThisIsASentenceForTesting
复制代码
有些问题,最后一行不对


这个可以了
  1. echo 'HelloWorld HelloWorld
  2. DoSomethingSpecial DoSomethingSpecial
  3. EnglishConditionAction EnglishConditionAction
  4. ThisIsASentenceForTesting ThisIsASentenceForTesting' |sed -r ':a;s/([[:upper:]][[:lower:]]*)([[:upper:] ].+)\1/\1\n\2\1/;ta;:b;s/([^\n ]+)\n(.+)/\U\1_\E\2/;tb;s/_ / /'
  5. HELLO_WORLD HelloWorld
  6. DO_SOMETHING_SPECIAL DoSomethingSpecial
  7. ENGLISH_CONDITION_ACTION EnglishConditionAction
  8. THIS_IS_A_SENTENCE_FOR_TESTING ThisIsASentenceForTesting

复制代码

论坛徽章:
22
处女座
日期:2014-10-11 13:33:292015亚冠之塔什干火车头
日期:2015-07-20 19:59:042015亚冠之塔什干火车头
日期:2015-07-26 10:59:31程序设计版块每日发帖之星
日期:2015-08-05 06:20:00每日论坛发贴之星
日期:2015-08-05 06:20:00程序设计版块每日发帖之星
日期:2015-08-07 06:20:00每日论坛发贴之星
日期:2015-08-07 06:20:002015亚冠之阿尔纳斯尔
日期:2015-10-01 15:23:28白银圣斗士
日期:2015-12-07 17:17:06操作系统版块每日发帖之星
日期:2015-12-27 06:20:002015亚冠之广州富力
日期:2015-07-08 15:48:31程序设计版块每日发帖之星
日期:2015-06-11 22:20:00
发表于 2015-01-08 13:47 |显示全部楼层
本帖最后由 聆雨淋夜 于 2015-01-08 14:01 编辑

jason的很赞

论坛徽章:
22
处女座
日期:2014-10-11 13:33:292015亚冠之塔什干火车头
日期:2015-07-20 19:59:042015亚冠之塔什干火车头
日期:2015-07-26 10:59:31程序设计版块每日发帖之星
日期:2015-08-05 06:20:00每日论坛发贴之星
日期:2015-08-05 06:20:00程序设计版块每日发帖之星
日期:2015-08-07 06:20:00每日论坛发贴之星
日期:2015-08-07 06:20:002015亚冠之阿尔纳斯尔
日期:2015-10-01 15:23:28白银圣斗士
日期:2015-12-07 17:17:06操作系统版块每日发帖之星
日期:2015-12-27 06:20:002015亚冠之广州富力
日期:2015-07-08 15:48:31程序设计版块每日发帖之星
日期:2015-06-11 22:20:00
发表于 2015-01-08 14:06 |显示全部楼层
  1. awk '{$1=gensub(/[[:upper:]]/,"_&","g",$1);$1=toupper($1);sub(/_/,"")}1' file
  2. HELLO_WORLD HelloWorld
  3. DO_SOMETHING_SPECIAL DoSomethingSpecial
  4. ENGLISH_CONDITION_ACTION EnglishConditionAction
  5. THIS_IS_A_SENTENCE_FOR_TESTING ThisIsASentenceForTesting
复制代码

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2015-01-08 14:09 |显示全部楼层
最崇拜你的sed
yinyuemi 发表于 2015-01-08 13:46
回复 1# 欧阳西风 有些问题,最后一行不对

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
发表于 2015-01-08 14:21 |显示全部楼层
回复 2# jason680


    感谢,果然好使,而且也很简洁

我对Perl了解比较少,$F[0]这个相当于去一行的第一个字段?
另外,我根据你的代码改了一下,应该没问题吧?

  1. perl -lape '$F[0]=~s/((?<=\w)[A-Z][a-z]*)/_\U${1}/g;$_="@F"' FILE
复制代码

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2015-01-08 14:22 |显示全部楼层
  1. sed -r 's/ /\n/; h;s/[A-Z]/_&/g;s/.*/\U&/;s/^_//g;G;s/\n.*\n/ /'
复制代码

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
发表于 2015-01-08 14:25 |显示全部楼层
回复 3# yinyuemi


    谢谢,经测试没问题。
我之前从没有写过这么长的sed命令,先回去研究一下是咋实现的

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
发表于 2015-01-08 14:28 |显示全部楼层
回复 5# 聆雨淋夜


    谢谢,已经测试没问题。

又提供了一种好的思路,我先收藏了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP