2011-07-08 50 views
3

我有一個文本文件,從一個Asterisk數據庫保存,看起來像這樣:用sed(或AWK),以取代前兩個斜線的每一行

/general/astbin         : /asterisk/bin 
/general/astlang         : /var/lib/asterisk/sounds/za 
/general/cdrdays         : 7 
/general/cellc1         : _084[02-9]XXXXXX 
/general/cellc2         : _0841. 

我只想剝離前兩個前鋒每行的斜線並用空格替換,但可以算出來。 做sed -i 's/\// /g'將刪除所有不需要的正斜槓。

任何人都有一些想法?

回答

3

快速絕招:

sed -i -e 's|/| |' -e 's|/| |' inputfile 
+0

我認爲你需要刪除'g's。 –

+0

我想你的意思是'sed -i -e's |/| |」 -e的|/| |'' –

+0

@Michael,是的,我很快編輯了這個。 :) – ssapkota

1

這應該工作:

sed -e 's/\// /' -e 's/\// /' 
+1

sed不需要使用/作爲分隔符,在這種情況下使用類似的東西:相反會提高可讀性。 – Vatine

0

這應該工作:

sed -i 's/^\/\([^\/]*\)\/ /\1 /' 
+0

你忘記了第二個空間。同樣使用任何字符都是錯誤的,因爲默認情況下模式匹配是貪婪的,因此它不起作用。 – przemoc

+0

這已得到糾正。 –

3

下面你有解決方案在一個去做它,而不是到其他解決方案(*):

sed -i 's,/\([^/]*\)/, \1 ,' file 

(*)除了Thaddee Tyl的一個,它是在我的之前發送的,但不幸的是最初不工作。

爲什麼最好一口氣做呢?

因爲它更健全,更高效。

這裏有一些有缺陷的比喻。如果你在圖書館尋找兩本書你以前從未去過的書,你不會找到第一本書,從圖書館出來,再次進來,開始尋找第二個忘記以前的嘗試。

「證明」

# use tmpfs to conduct test in memory, avoiding disk I/O overhead 
$ mkdir stupid-sed-speed-test 
$ sudo mount -t tmpfs tmpfs stupid-sed-speed-test/ -o size=1050M 
$ cd stupid-sed-speed-test/ 

# create 512 MB + "//\n" at the end 
$ awk 'BEGIN{printf"%*s",512*1024**2,"";print"//";exit}' >file 

# "forgetting" solution 

$ time sed -e 's|/| |' -e 's|/| |' file >/dev/null 

real 0m4.817s 
user 0m3.388s 
sys  0m1.424s 

$ time sed -i -e 's|/| |' -e 's|/| |' file 

real 0m5.450s 
user 0m3.360s 
sys  0m2.076s 

# recreate 512 MB + "//\n" at the end 
$ awk 'BEGIN{printf"%*s",512*1024**2,"";print"//";exit}' >file 

# "one go" solution 

$ time sed 's,/\([^/]*\)/, \1 ,' file >/dev/null 

real 0m3.548s 
user 0m2.080s 
sys  0m1.464s 

$ time sed -i 's,/\([^/]*\)/, \1 ,' file 

real 0m4.155s 
user 0m2.068s 
sys  0m2.080s 

(我的硬件規格對於那些好奇他們:Desktop

差異肯定不是一個令人興奮的一個,但有25%有時很多。

+0

@Stephen:我認爲最好更新我的答案,以便更好地向您展示「一次性」解決方案與天真的解決方案(由您接受)之間的差異。 – przemoc

+0

Upvote爲您的'理論提供證據。'去科學! – Marcin

+0

@przemoc:感謝您的更新,雖然我嘗試的解決方案非常快,但我甚至沒有注意到它;) – Stephen