Используйте sed (или awk) для замены первых двух косых черт в каждой строке - PullRequest
3 голосов
/ 08 июля 2011

У меня есть текстовый файл, сохраненный из базы данных 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' удалит ВСЕ косые черты, чего я не хочу.

У кого-нибудь есть мысли?

Ответы [ 4 ]

3 голосов
/ 08 июля 2011

Ниже у вас есть решение, делающее это за один раз, в отличие от других решений (*):

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

(*) за исключением одного Тэдди Тила, который был отправлен прямо перед моим, но, к сожалению, изначально не работал.

Почему лучше сделать это за один раз?

Потому что это более разумно и просто более эффективно.

Вот некоторая ошибочная аналогия. Если вы ищете две книги автора Z в библиотеке, которой раньше не было, вы не найдете первую, выйдите из библиотеки, войдите снова и начните искать вторую, забыв о предыдущей попытке.

"Proof"

# 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% - это много.

3 голосов
/ 08 июля 2011

Быстрый трюк:

sed -i -e 's|/| |' -e 's|/| |' inputfile
1 голос
/ 08 июля 2011

Это должно работать:

sed -e 's/\// /' -e 's/\// /'
0 голосов
/ 08 июля 2011

Это должно работать:

sed -i 's/^\/\([^\/]*\)\/ /\1 /'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...