我有一个文本文件,从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'
将删除所有正斜杠,这是我不想要的。
有人有想法吗?
答案 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 /'