使用sed(或awk)替换每一行的前两个斜杠

时间:2011-07-08 10:07:08

标签: linux sed awk

我有一个文本文件,从Asterisk db中保存,看起来像这样:

/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'将删除所有正斜杠,这是我不想要的。

有人有想法吗?

4 个答案:

答案 0 :(得分:3)

快速技巧:

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

答案 1 :(得分:3)

下面你有解决方案一次完成,而不是其他解决方案(*):

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

(*)除了Thaddee Tyl的那个,它是在我之前发送的,但遗憾的是最初没有工作。

为什么一次性完成这项工作会更好?

因为它更健全,更有效率。

这是一些有缺陷的类比。如果你在图书馆中寻找作者Z的两本书,你以前没有找到过,你找不到第一本书,从图书馆出去,再次进入并开始寻找第二张,忘记以前的尝试。

“校样”

# 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%。

答案 2 :(得分:1)

这应该有效:

sed -e 's/\// /' -e 's/\// /'

答案 3 :(得分:0)

这应该有效:

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