2014-10-07 15 views

回答

4

我會用awk:

awk -F/ '{printf "%[email protected]%s\n",$NF,$(NF-1)}' input.file 

-F/標誌着/作爲字段分隔符。使用$1$3,...您可以訪問字段。 $0代表完整記錄。 NF表示一行中的字段數。知道了這一點,可以使用$NF選擇一行中的最後一個字段,並使用$(NF-1)選擇第二個最後一個字段,並使用@作爲分隔符來打印它們。

+0

幹得好!我做了一個小修改。我已經+1了,所以我不能:) – fedorqui 2014-10-07 14:00:21

+0

@fedorqui感謝(重要)編輯!錯過了...... – hek2mgl 2014-10-07 14:09:50

+0

非常感謝。這工作很好,教給我一兩個關於分隔符的東西。偉大你花時間寫出解釋。如果可以,我會+1。 – guppshouse 2014-10-08 07:53:14

5

你可以試試下面的sed命令。

$ sed 's~.*/\([^/]*\)/\([^/]*\)$~\[email protected]\1~g' file 
[email protected] 
[email protected] 
jo[email protected] 
[email protected] 

說明:

  • .*/匹配的所有字符從一開始就高達了/符號(第二斜線從最後一個符號)。
  • \(...\)被稱爲捕獲組,用於捕獲字符。
  • [^/]*匹配任何字符,但不匹配/零次或多次。所以合併的\([^/]*\)將捕獲在最後的/符號之前存在的所有字符。
  • /匹配最後一個正斜槓。
  • \([^/]*\)捕獲所有字符但不是/零次或多次到另一個組中。
  • $表示行結束。
  • 在替換零件中,反向引用捕獲的組,例如\1,\2將在對應的組內打印字符。
+0

感謝您的回覆。我無法理解這裏的邏輯。 SED是我的第一個想法,但我太新了,迷了路。 – guppshouse 2014-10-08 07:55:21

+0

@guppshouse我認爲現在很清楚..問我是否有任何疑問.. – 2014-10-08 09:04:35

+1

+1爲好的解釋。你應該更頻繁地做:) – fedorqui 2014-10-08 09:07:01

1

使用bash內建命令(參數擴展):

#!/bin/bash 

while read LINE; do 
    NAME="${LINE##*/}" 
    DOMAIN="${LINE%*/$NAME}" 
    DOMAIN="${DOMAIN##*/}" 
    echo "[email protected]$DOMAIN" 
done < filename 

輸出:

[email protected] 
[email protected] 
[email protected] 
[email protected] 

與sed的一種替代方案:

sed -E 's|^.*/(.*)/([^ ]*)|\[email protected]\1|' filename 
+1

我看到這個SED幾乎和Avinash Raj的一樣。我怕我迷路了。如果有時間做出解釋,我很樂意。 – guppshouse 2014-10-08 07:57:24

相關問題