繁体   English   中英

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

[英]Use sed (or awk) to replace first two slashes on every line

我有一个文本文件,从 Asterisk 数据库中保存,如下所示:

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

有人有什么想法吗?

快速技巧:

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

下面是一个 go 的解决方案,而不是其他解决方案 (*):

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

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

为什么最好在一个 go 中完成?

因为它更理智,更有效。

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

“证明”

# 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

(我对那些好奇的人的硬件规格:桌面

差异肯定不是一个令人兴奋的差异,但有时 25% 是很多。

这应该有效:

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

这应该有效:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM