我想删除文件中以 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命令。
答案 0 :(得分:3)
这可能适合你(GNU sed):
sed 's/\b[34]:\S*\s*//g' file
查找单词边界,然后查找3
或4
后跟:
和零个或多个非空格,后跟零个或多个空格,并在整个行中删除它们。< / 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:。