如何删除以unix文件中某些特定模式开头的单词

时间:2014-03-31 09:07:08

标签: unix sed awk

我想删除文件中以 3: 4:

开头的所有字词

例如 -

输入

13 1:12 2:14 3:11
10 1:9 2:7 4:10 5:2
16 3:7 8:24
7 4:7 6:54

输出

13 1:12 2:14
10 1:9 2:7 5:2
14 8:24
7 6:54

有人可以告诉我是否可以使用sed命令或awk命令。

5 个答案:

答案 0 :(得分:3)

这可能适合你(GNU sed):

sed 's/\b[34]:\S*\s*//g' file

查找单词边界,然后查找34后跟:和零个或多个非空格,后跟零个或多个空格,并在整个行中删除它们。< / p>

答案 1 :(得分:1)

使用awk

awk '{for (i=1; i<=NF; i++)
        {if (! sub("^[34]:", "", $i)) d=d$i" "}
        print d; d=""
     }' file

它循环遍历字段,只存储在变量d中那些不以3:4:开头的变量。这是通过检查sub()函数是否返回true来完成的。完成整个循环后,将打印d变量。

对于您的给定文件:

$ awk '{for (i=1; i<=NF; i++) {if (! sub("^[34]:", "", $i)) d=d$i" "} print d; d=""}' file
13 1:12 2:14 
10 1:9 2:7 5:2 
16 8:24 
7 6:54 

答案 2 :(得分:1)

使用sed

sed -r 's/ 3:[0-9]*| 4:[0-9]*//g'


$ cat input.txt
13 1:12 2:14 3:11 10 1:9 2:7 4:10 5:2 16 3:7 8:24 7 4:7 6:54


$ cat input.txt | sed -r 's/ 3:[0-9]*| 4:[0-9]*//g'
13 1:12 2:14 10 1:9 2:7 5:2 16 8:24 7 6:54

说明:

  • -r =正则表达式搜索
  • 3:[0-9]*:搜索一个空格,然后是3,然后:,然后是[0-9]或0到9之间的数字,*意味着他将在前一个正则表达式中搜索零次或多次点击搜索,这是[0-9],所以*表示在这种情况下将在第一个数字后面搜索零个或多个数字:
  • |:表示OR
  • 4:[0-9]*:与上述相同,但不是3,而是搜索4
  • //:替换字符串,如果你把POTATOE放在栏后面就会键入它,在这种情况下,sed将不会输入任何内容。
  • /g:搜索传递给sed的所有输入。

答案 3 :(得分:0)

假设所有单词都包含:并且在:

之后至少有一位数字
sed "s/ \([34]:[^\b]+\)//g" inputfile

这匹配SPACE,3或4,冒号,然后至少一个非单词边界。它取而代之的是整条生产线。

答案 4 :(得分:0)

sed 's/[[:blank:]][34]:[^[:blank:]]\{1,\}[[:blank:]]*/ /g' YourFile

Posix兼容并假设没有(如样本中)第一个单词陈述3:或4:。