我有以下內容的輸出文件,:操縱路徑到電子郵件地址
./E/domainname.com/martin
./s/domain2.com/shelly
./E/2/4domain.com/john
./X/another.net/gary
我想:
[email protected]
[email protected]
等等。
我一直試圖通過在行中向後搜索來隔離用戶名,直到我點擊/
,但我迄今失敗了。
我有以下內容的輸出文件,:操縱路徑到電子郵件地址
./E/domainname.com/martin
./s/domain2.com/shelly
./E/2/4domain.com/john
./X/another.net/gary
我想:
[email protected]
[email protected]
等等。
我一直試圖通過在行中向後搜索來隔離用戶名,直到我點擊/
,但我迄今失敗了。
我會用awk:
awk -F/ '{printf "%[email protected]%s\n",$NF,$(NF-1)}' input.file
-F/
標誌着/
作爲字段分隔符。使用$1
,$3
,...您可以訪問字段。 $0
代表完整記錄。 NF
表示一行中的字段數。知道了這一點,可以使用$NF
選擇一行中的最後一個字段,並使用$(NF-1)
選擇第二個最後一個字段,並使用@
作爲分隔符來打印它們。
你可以試試下面的sed命令。
$ sed 's~.*/\([^/]*\)/\([^/]*\)$~\[email protected]\1~g' file
[email protected]
[email protected]
jo[email protected]
[email protected]
說明:
.*/
匹配的所有字符從一開始就高達了/
符號(第二斜線從最後一個符號)。\(...\)
被稱爲捕獲組,用於捕獲字符。[^/]*
匹配任何字符,但不匹配/
零次或多次。所以合併的\([^/]*\)
將捕獲在最後的/
符號之前存在的所有字符。/
匹配最後一個正斜槓。\([^/]*\)
捕獲所有字符但不是/
零次或多次到另一個組中。$
表示行結束。\1
,\2
將在對應的組內打印字符。感謝您的回覆。我無法理解這裏的邏輯。 SED是我的第一個想法,但我太新了,迷了路。 – guppshouse 2014-10-08 07:55:21
@guppshouse我認爲現在很清楚..問我是否有任何疑問.. – 2014-10-08 09:04:35
+1爲好的解釋。你應該更頻繁地做:) – fedorqui 2014-10-08 09:07:01
使用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
我看到這個SED幾乎和Avinash Raj的一樣。我怕我迷路了。如果有時間做出解釋,我很樂意。 – guppshouse 2014-10-08 07:57:24
幹得好!我做了一個小修改。我已經+1了,所以我不能:) – fedorqui 2014-10-07 14:00:21
@fedorqui感謝(重要)編輯!錯過了...... – hek2mgl 2014-10-07 14:09:50
非常感謝。這工作很好,教給我一兩個關於分隔符的東西。偉大你花時間寫出解釋。如果可以,我會+1。 – guppshouse 2014-10-08 07:53:14