2012-03-14 199 views
0

我想了解sed的: '// d' 命令

$ echo "reverse me" \ 
| sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' 
em esrever 

found here)。 但我無法獲得

//D 

命令。 雖然刪除//

/\n/!{ 
G 
} 
s/\(.\)\(.*\n\)/&\2\1/ 
D 
s/.// 

它不起作用(似乎是一個循環)。

我沒有發現關於手冊頁或sed faq上的//地址的任何內容(有時使用它,但沒有解釋)。

任何幫助,將不勝感激。

在當前頁

回答

0

從見手冊頁:

[2addr] d 刪除模式空間的初始段通過 第一個換行符開始下一個循環。

0

您可以省略sed中某個模式的內容,並將其作爲//,這意味着將其視爲與上次使用的正則表達式相同。通過刪除它,您可以將模式匹配時的刪除更改爲始終刪除。

0

這可能會爲你工作:

echo reverse me | sed '/\n/!G;l;s/\(.\)\(.*\n\)/&\2\1/;l;//D;s/.//' 
reverse me\n$ 
reverse me\neverse me\nr$ 
everse me\nr$ 
everse me\nverse me\ner$ 
verse me\ner$ 
verse me\nerse me\nver$ 
erse me\nver$ 
erse me\nrse me\never$ 
rse me\never$ 
rse me\nse me\nrever$ 
se me\nrever$ 
se me\ne me\nsrever$ 
e me\nsrever$ 
e me\n me\nesrever$ 
me\nesrever$ 
me\nme\n esrever$ 
me\n esrever$ 
me\ne\nm esrever$ 
e\nm esrever$ 
e\n\nem esrever$ 
\nem esrever$ 
\nem esrever$ 
em esrever 

我已經添加了幾個l命令之前和替代命令後

sed命令的工作原理如下:

  1. 對於第一次只通過,向模式空間添加換行符/\n/!G
  2. 正則表達式組ps的第一個字符\(.\)(AKA \1),然後一切到第一個換行\(.*\n\)(AKA \2),然後用整個匹配&替換這兩個組,然後\2\1
  3. 如果在替換//D之前先前的正則表達式爲真,則刪除第一個換行符,即刪除先前的&表達式並開始新的循環,但是不要讀取新行。有效循環直到正則表達式失敗。
  4. 刪除第一個字符,即已經制定它的方式到字符串s/.//