2010-11-12 107 views
6

我正在製作一個emacs org模式的日出指揮官命令從.el文件(想做一個備忘單)的表。名單如下:sed:用另一個字符替換多個句點

/, j .......... go to directory 
p, n .......... move cursor up/down 
M-p, M-n ...... move cursor up/down in passive pane 
^, J .......... go to parent directory 
... 

我想做出與此格式的組織模式表:

| /, j  | go to directory      | 
| p, n  | move cursor up/down     | 
| M-p, M-n | move cursor up/down in passive pane | 
| ^, J  | go to parent directory    | 
... 

組織會照顧間距的;我只需要「|命令|解釋|」

我不能讓sed用垂直斜槓替換多個句點。我目前的嘗試都是這樣:

cat in.org | sed -e 's/[.]*/|/g' > out.org 
cat in.org | sed -e 's/[.]/|/g' > out.org 
cat in.org | sed -e 's/[.*]/|/g' > out.org 

我已經用這個來代替領導,並與垂直斜線結尾的空白:

sed -e 's/^[ \t]*/|/g;s/[ \t]*$/|/g'| 

現在我只需要爲一個字符串做同樣的週期。恐怕我不能很好地理解它,把它看作是一段時期(並且瞄準一個時期)而不是把它們當作通配符來對待。第二個和第三個處理每個時期像一個時期,因爲我結束了一堆垂直斜線。

但是第一個似乎是在每個單個字符之間放置一個垂直斜線,所以我不確定它爲什麼會這樣做。看起來它會像通配符那樣行事。

感謝您的任何幫助。

回答

4

您需要跳過這段時間;期間匹配「任何字符」。而且,由於SED並不總是有一個+(1個或多個)運營商,你想用一個後跟0或更多,如

[email protected]:~$ echo 'h...ello world' | sed 's/^/|/;s/\.\.*/|/;s/$/|/' 
|h|ello world| 

而且,重讀你的問題後,你想在一個管開始和結束。所以,用管道替換^和$也是如此。你可以用三個-e表達式來做到這一點,但我喜歡把所有三個都放在命令行中用分號隔開。它有助於使圖案更像線條噪音。 :)

如果要匹配2個或更多時間段,請使用\.\.\.*。等等。可惜的是,sed並不總是支持範圍表達式。

+0

很好。這是第一次,工作很好。現在我想到了,語法是有道理的,儘管我的問題是認爲*是「匹配1或更多」,而不是0或更多,在這種情況下,您是正確的:我需要一段時間,後面跟着0或更多的時間段。 – Hendy 2010-11-12 23:00:27

4

這應該爲你做它:

sed -r -e 's/\.{2,}/|/' -e 's/(.*)/|\1|/' 

{2,}只是說來匹配2個或更多,因此,如果您遇到在其他地方時期,你不會有問題。 '-e'進行多個正則表達式,'-r'表示使用擴展正則表達式。

希望它有效,它對gnu sed 4.1.2有效。

+0

贊同{2,}解決方案。那很棒。沒有碰巧有更多的時期,但偉大的思想 - 仔細編碼!不過,我並不關注第二部分。對我來說,它大部分工作,但在第一列中插入了很多標籤,所以我的結果就像「| command \ t \ t \ t \ t | t解釋|」。很難在評論框中輸入! – Hendy 2010-11-12 23:04:55