Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在unix中删除文件中以特定模式开头的单词_Unix_Sed_Awk - Fatal编程技术网

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

如何在unix中删除文件中以特定模式开头的单词,unix,sed,awk,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命令。使用awk: awk '{for (i=1; i<=NF; i++) {if (! sub("^[34]:", "", $i)) d=d$i" "}

我想删除文件中以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命令。

使用
awk

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

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

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],因此*表示在这种情况下,将在以下第一个数字后面搜索零个或多个数字:
  • |
    :表示或
  • 4:[0-9]*
    :与上面相同,只是它将搜索4而不是3
  • /
    :替换字符串,如果你把POTATOE关起来,它将键入它,在这种情况下,sed将不键入任何内容
  • /g
    :搜索传递给sed的所有输入
带有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],因此*表示在这种情况下,将在以下第一个数字后面搜索零个或多个数字:
  • |
    :表示或
  • 4:[0-9]*
    :与上面相同,只是它将搜索4而不是3
  • /
    :替换字符串,如果你把POTATOE关起来,它将键入它,在这种情况下,sed将不键入任何内容
  • /g
    :搜索传递给sed的所有输入

假设所有单词都包含:并且在以下数字后至少有一个数字:

sed "s/ \([34]:[^\b]+\)//g" inputfile

这将匹配空格、3或4、冒号以及至少一个非单词边界。它将不替换任何内容,并对整行执行此操作。

假设所有单词都包含:并且在以下数字后至少有一个数字:

sed "s/ \([34]:[^\b]+\)//g" inputfile
这将匹配空格、3或4、冒号以及至少一个非单词边界。它将不替换任何内容,并对整个行执行此操作。

这可能适用于您(GNU-sed):

查找单词边界,然后查找
3
4
后跟
和零个或多个非空格后跟零个或多个空格,并在整行中删除它们。

这可能适用于您(GNU-sed):

sed 's/[[:blank:]][34]:[^[:blank:]]\{1,\}[[:blank:]]*/ /g' YourFile
查找单词边界,然后查找
3
4
后跟
和零个或多个非空格后跟零个或多个空格,并在整行中删除它们

sed 's/[[:blank:]][34]:[^[:blank:]]\{1,\}[[:blank:]]*/ /g' YourFile
Posix兼容,并假设没有(如示例中)第一个单词以3:或4:表示


Posix兼容,并假设没有(如示例中)第一个单词以3:或4:表示。

这将在删除字段的任何地方留下额外的空间。我现在使用另一种不留空间的方法进行了更新,就在行的末尾。这将在删除字段的任何地方留下额外的空间。我现在用另一种不留空间的方法进行了更新,就在行尾。
\b
的对立面是
\b
,但是它是一个锚定而不是一个字符,可以在这个上下文中使用。
\b
的对立面是
\b
但是它是一个锚定而不是一个字符,可以在这个上下文中使用。在这种情况下,不需要进行替换,因为
3 | 4
可以被替换通过
[34]
。但是,这不会删除行首的任何此类字符串,因为它正在regexp的开头寻找一个空格。Poton部分正确:)不需要交替,但如果我们假设每行的第一个数字后面永远不会有一个:,那么它就可以正常工作。无论如何,这里有一个较短的版本sed-r的//[34]:[0-9]*///g'替换在这种情况下是不必要的,因为
3 | 4
可以替换为
[34]
。但是,这不会删除行首的任何此类字符串,因为它正在regexp的开头寻找一个空格。Poton部分正确:)不需要交替,但如果我们假设每行的第一个数字后面永远不会有一个:,那么它就可以正常工作。无论如何,这里有一个较短的版本sed-r的//[34]:[0-9]*///g'