2010-06-22 66 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