2010-06-22 72 views
0

我试图用sed删除与行的文本文件的部分,如:关于sed命令的问题?

23920 ES:1 R:2 C:14 L:5 CH 80 7279 1113 5272 1168 -342 5642 1265 -347 5587

23921个ES: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

+0

它总是相同的7个字段,你需要删除? – 2010-06-22 20:13:06

+0

@Jed:好点,如果答案是肯定的,'awk'可能是更好的(或至少更优化的)工具。 – 2010-06-22 20:15:53

回答

2
之间

您也可以使用cut对于这一点,如果它总是相同的字段:

[email protected]:~$ 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

A sed solution

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>/<替换>/g会替换匹配< regexp>的所有行的每个部分,替代<替换>。

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

  1. 搜索ES:
  2. 然后SEACH的一切,直到看到
  3. 的空间前述CH后跟一个空格,一个或多个数字和另一个空格

和<替换>是空字符串,因此它有效地删除了匹配行的部分它。

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

+0

你能解释一下上面的sed命令的每个部分是什么吗?这样我们都可以学习,而不是像每个变种一样依赖像你这样的sed大师。我不得不承认我没有解释我的切入命令,所以我编辑并添加了解释,但是sed要复杂得多。 – 2010-06-22 22:19:23

+0

@Jed:你去吧 – 2010-06-23 01:38:36

+0

@VinkoVrsalovic,注意'-r'选项是一个GNU sed主题,既不标准也不普遍。更好的现代方法是'-E'选项,但即使这不是通用的。最好的方法是使用BRE,它可以在所有版本的sed中工作。 – ghoti 2017-02-12 21:49:30