关于sed命令的问题?

时间:2010-06-22 20:11:37

标签: linux sed

我正在尝试使用sed删除文本文件的某些部分,例如:

  

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

我需要删除的部分是每行中的E S:1 R:2 C:14 L:5 ch 80E S:1 R:2 C:14 L:6 ch 1等部分。整个文件中的数字会发生变化,但总是在1到100之间。

2 个答案:

答案 0 :(得分:2)

如果它始终是相同的字段,您也可以使用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之后的所有字段

答案 1 :(得分:1)

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 /< regexp> /< substitution> / g替换匹配< regexp>的每一行的每个部分。 for< substitution>。

在这种情况下< regexp>是E S:.* ch [0-9]+,意思是:

  1. 搜索E S:
  2. 然后搜索所有内容,直到看到
  3. ch之前的空格,后跟空格,一个或多个数字和另一个空格
  4. < substitution>是空字符串,因此它有效地删除与其匹配的行的部分。

    -r开关信号sed我们正在使用'扩展'正则表达式,这通常更清晰,因为它们不需要标准sed regexp所需的那么多反斜杠。