Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
Linux 关于sed命令的问题?_Linux_Sed - Fatal编程技术网

Linux 关于sed命令的问题?

Linux 关于sed命令的问题?,linux,sed,Linux,Sed,我试图使用sed删除文本文件中的某些部分,其行如下: 23920E S:1R:2C:14L:5Ch80727911135272-3421685642-3471265587 23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587-31 1306 4692 我需要删除的部分是每行中的es:1r:2c:14l:5ch80和es:1r:2c:14l:6ch1。数字在整个文件中都会发生变化,但始终在1到100之间。如果始终使用相同的字段,也可以使

我试图使用sed删除文本文件中的某些部分,其行如下:

23920E S:1R:2C:14L:5Ch80727911135272-3421685642-3471265587

23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587-31 1306 4692


我需要删除的部分是每行中的
es:1r:2c:14l:5ch80
es:1r:2c:14l:6ch1
。数字在整个文件中都会发生变化,但始终在1到100之间。

如果始终使用相同的字段,也可以使用
cut

jed@jed-osx:~$ echo "23920 E S:1 R:2 C:14 L:5 ch 80 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587 -31 1306 4692" | cut -d" " -f1,8-
23920 80 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 1 4605 1267 4586 11 1331 4587 -31 1306 4692
编辑:对使用的剪切命令的说明:

-d”“
使用空格作为分隔符


-f 1,8-
返回字段1、字段8和8之后的所有字段

您也可以使用
cut
进行此操作,如果它始终是相同的字段:

jed@jed-osx:~$ echo "23920 E S:1 R:2 C:14 L:5 ch 80 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587 -31 1306 4692" | cut -d" " -f1,8-
23920 80 7279 1113 5272 -342 1168 5642 -347 1265 5587
23921 1 4605 1267 4586 11 1331 4587 -31 1306 4692
编辑:对使用的剪切命令的说明:

-d”“
使用空格作为分隔符

-f 1,8-
返回字段1、字段8和8之后的所有字段

linux-t77m:$ more st.txt
23920 E S:1 R:2 C:14 L:5 ch 80 7279 1113 5272 -342 1168 5642 -347 1265 5587

23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587 -31 1306 4692

linux-t77m:$ sed -r "s/E S:.* ch [0-9]+ //g" st.txt
23920 7279 1113 5272 -342 1168 5642 -347 1265 5587

23921 4605 1267 4586 11 1331 4587 -31 1306 4692
这是通过正则表达式替换完成的。命令s///g替换与匹配的每行的每一部分

在这种情况下是
es:.*ch[0-9]+
,这意味着:

  • 搜索电子邮件:
  • 然后搜索一切直到你看到
  • ch前面的一个空格,后跟一个空格、一个或多个数字和另一个空格
  • 和是空字符串,因此它有效地删除与之匹配的行的部分

    r开关表示我们正在使用一个“扩展”正则表达式,它通常更清晰,因为它们不需要标准sed regexp需要的那么多反斜杠

    sed解决方案

    linux-t77m:$ more st.txt
    23920 E S:1 R:2 C:14 L:5 ch 80 7279 1113 5272 -342 1168 5642 -347 1265 5587
    
    23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587 -31 1306 4692
    
    linux-t77m:$ sed -r "s/E S:.* ch [0-9]+ //g" st.txt
    23920 7279 1113 5272 -342 1168 5642 -347 1265 5587
    
    23921 4605 1267 4586 11 1331 4587 -31 1306 4692
    
    这是通过正则表达式替换完成的。命令s///g替换与匹配的每行的每一部分

    在这种情况下是
    es:.*ch[0-9]+
    ,这意味着:

  • 搜索电子邮件:
  • 然后搜索一切直到你看到
  • ch前面的一个空格,后跟一个空格、一个或多个数字和另一个空格
  • 和是空字符串,因此它有效地删除与之匹配的行的部分


    r开关表示我们正在使用一个“扩展”正则表达式,它通常更清晰,因为它们不需要标准sed regexp需要的那么多反斜杠

    您需要删除的7个字段总是相同的吗?@Jed:好的,如果答案是肯定的,
    awk
    可能是一个更好(或至少更优化)的工具。您需要删除的7个字段总是相同的吗?@Jed:好的,如果答案是肯定的,
    awk
    可能更好(或至少更优化)你能解释一下上面sed命令的每一部分是做什么的吗?通过这种方式,我们都可以学习,而不是依赖于像您这样的sed大师来完成每个变化。我必须承认我没有解释我的cut命令是有罪的,所以我编辑并添加了解释,但是sed要复杂得多。@VinkoVrsalovic,请注意,
    -r
    选项是GNU-sed ism,既不是标准的,也不是通用的。一个更好的现代方法是
    -E
    选项,但即使这样也不是通用的。最好的方法是使用BRE,它可以在所有版本的sed中工作。您能解释一下上面的sed命令的每个部分都做了什么吗?通过这种方式,我们都可以学习,而不是依赖于像您这样的sed大师来完成每个变化。我必须承认我没有解释我的cut命令是有罪的,所以我编辑并添加了解释,但是sed要复杂得多。@VinkoVrsalovic,请注意,
    -r
    选项是GNU-sed ism,既不是标准的,也不是通用的。一个更好的现代方法是
    -E
    选项,但即使这样也不是通用的。最好的方法是使用BRE,它将适用于所有版本的sed。