Chinaunix
标题:
匹配首字母大写的两个域【删除首字母大写的人名】
[打印本页]
作者:
bryanw
时间:
2010-08-29 18:49
标题:
匹配首字母大写的两个域【删除首字母大写的人名】
大家好,我的需求是删除人名:1. 两个单词;2. 每个单词的首字母大写。
比如以下文件内容,只删除第一行,其他行不删除
Bill Gates
Bill gates
bill Gates
bill gates
我的脚本 echo "Bill Gates" | awk '{ if ( $1 ~ /[^A-Z]/ && $2 ~ /[^A-Z]/ ) print $0 }', 这个脚本哪里有问题呢?谢谢!
作者:
bryanw
时间:
2010-08-29 19:05
有朋友帮忙写了一个脚本:
echo "ill Gates" | awk '{if ($1 !~ /^[A-Z]/ || $2 !~ /^[A-Z]/){print $0}}'
这个脚本在三台机器上测试awk:A 3.1.5; B 3.1.5; C 3.1.7
结果是:A上管用,B和C不管用。
不知道这是什么原因造成的。
作者:
bbgg1983
时间:
2010-08-29 19:10
suntao@~$ cat a
Bill Gates
Bill gates
bill Gates
bill gates
suntao@~$ sed -r '/^[A-Z][^ ]+ [A-Z][^ ]+/d' a
Bill gates
bill Gates
bill gates
复制代码
作者:
bryanw
时间:
2010-08-29 19:18
管用! 谢谢楼上朋友的解答!
作者:
bryanw
时间:
2010-08-29 19:20
啊! 好像也不太好...
因为这样的会把其他非两个单词的域都删掉了,比如:
Hello Bill Gates
有办法只删掉只有两个域的、满足条件的行吗?
作者:
bbgg1983
时间:
2010-08-29 19:25
改一下就ok了:
sed -r '/^[A-Z][^ ]+ [A-Z][^ ]+$/d'
复制代码
作者:
bryanw
时间:
2010-08-29 19:28
这个好!
多谢 bbgg1983 !
作者:
jiwang1980
时间:
2010-08-29 19:46
我的机子上 awk域匹配也不管用,好奇怪
[telnet@localhost awk]$ awk --version
GNU Awk 3.1.5
Copyright (C) 1989, 1991-2005 Free Software Foundation.
作者:
bbgg1983
时间:
2010-08-29 19:57
回复
8#
jiwang1980
用mawk即可
作者:
ly5066113
时间:
2010-08-29 21:01
export LANG=C
awk '...'
作者:
bbgg1983
时间:
2010-08-29 21:05
回复
10#
ly5066113
tim,为什么mawk可以,gawk,nawk都不可以呢
作者:
ly5066113
时间:
2010-08-29 23:27
回复
11#
bbgg1983
这个不清楚了,版本问题吧。
可能不同版本的awk影响它的环境变量不一样。
作者:
rdcwayx
时间:
2010-08-30 08:50
awk '$1~/^[A-Z]/&&$2~/^[A-Z]/' infile
复制代码
楼主一楼的 ^ 放到 [ ] 里了,这个应该是问题的根源。
作者:
bbgg1983
时间:
2010-08-30 08:53
回复
13#
rdcwayx
这个你试了吗?
作者:
rdcwayx
时间:
2010-08-30 08:56
回复 rdcwayx
这个你试了吗?
bbgg1983 发表于 2010-08-30 08:53
$ awk '$1~/^[A-Z]/&&$2~/^[A-Z]/' infile
Bill Gates
$ awk '$1~/[^A-Z]/&&$2~/[^A-Z]/' infile
Bill Gates
Bill gates
bill Gates
bill gates
复制代码
作者:
bbgg1983
时间:
2010-08-30 08:57
看来是和环境有关系~
作者:
jiwang1980
时间:
2010-08-30 09:24
回复
9#
bbgg1983
mawk也没有
BTW,10楼tim大神的方法可以
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2