如何删除包含某些字符串或char的字段?

时间:2015-04-10 17:30:28

标签: bash shell awk sed tr

我有一个包含

的.txt文件
Name: Dean AGE: 23 Hometown: Chicago
Name: Mary AGE: 68 hometown: New York
Name: Lisa age: 36 Hometown: Los angeles
Name: Greg Age: 18 hometown: London

我怎么会sed,awk或tr“名字:”,“年龄:”和“家乡:”所以结果是:

Dean 23 Chicago
Mary 68 New York
Lisa 36 Los angeles
Greg 18 London

我能想到的唯一一件事就是把所有的字段都打开并打印出来,例如:

awk '{for (i=1;i<=NF;i++) {if ($i !~/:/) {print i,$i}}}'

然而,这给了我结果:

Dean 
23 
Chicago
Mary 
68 
New 
York
Lisa 
36 
Los 
angeles
Greg 
18 
London

正如你所看到的,它打印出了自己的每一个领域,打破了纽约和纽约,以及洛杉矶和安吉利斯。

我的另一个想法就是逐一发出“名字:”,“年龄:”和“家乡:”,所有命令都用不同的命令代替它们,这样就可以了。例如:

sed 's/Name://g'

但是,有没有办法让它不区分大小写,因为有“年龄:”,“年龄:”和“年龄:”

5 个答案:

答案 0 :(得分:4)

如果你有GNU sed,它有一个选项I用于不区分大小写的匹配:

sed 's/Name://gI;s/Age://gI;s/Hometown://gI' file

稍作修改,awk解决方案就可以了:

awk '{ for(i=1;i<=NF;i++) {if ($i ~/:/) {$i=""}} ; print }' file

答案 1 :(得分:4)

$ awk -F' ?[^ ]+: ' '{print $2, $3, $4}' file
Dean 23 Chicago
Mary 68 New York
Lisa 36 Los angeles
Greg 18 London

或通常用于任意数量的字段:

$ awk -F' ?[^ ]+: ' '{for (i=2;i<=NF;i++) printf "%s%s", $i, (i<NF?OFS:ORS)}' file
Dean 23 Chicago
Mary 68 New York
Lisa 36 Los angeles
Greg 18 London

答案 2 :(得分:2)

你也可以使用这个gnu-awk命令:

awk -v IGNORECASE=1 -v OFS='\t' -F ' *(Name|AGE|Hometown): *' ' {
      printf $2; for (i=3; i<=NF; i++) printf OFS $i; print ""}' file
Dean    23    Chicago
Mary    68    New York
Lisa    36    Los angeles
Greg    18    London

答案 3 :(得分:2)

如何从输入中删除以:结尾的所有单词并打印剩下的内容呢?

$ awk '{ gsub(/[^ ]+: /, "") }1' data.txt
Dean 23 Chicago
Mary 68 New York
Lisa 36 Los angeles
Greg 18 London

修改:正如评论中所建议的那样,或许更重要的是sed等价物:

sed -r 's/[^ ]+: //g' data.txt   # gnu

sed -E 's/[^ ]+: //g' data.txt   # bsd

答案 4 :(得分:1)

用perl打答答案:

删除特定标签:

perl -pe 's/(?:name|age|hometown): *//ig' file

删除任何标签:

perl -pe 's/\w+:\s*//ig' file

tr不是正确的工具,因为它会映射字符,而不是单词。