Я могу гарантировать вам, что только bash
не будет быстрее, чем sed
для этой задачи.Запуск внешних процессов в bash
- это, как правило, плохая идея, но только если вы делаете это много.
Итак, если вы запускаете процесс sed
для каждой строкиВаш вклад, я буду обеспокоен.Но ты не.Вам нужно только запустить one sed
, который сделает всю работу за вас.
Однако вы можете обнаружить, что следующий sed
будет немного быстрее вашей версии:
(whatever) | sed 's/...$//'
Все, что это делает, это удаляет последние три символа в каждой строке, а не заменяет всю строку более короткой версией.Теперь, может быть, более современные движки RE могут оптимизировать вашу команду, но зачем рисковать.
Если честно, единственный способ, которым я могу думать об этом, был бы быстрее - это создать собственный фильтр на основе Cпрограмма.И единственная причина, по которой может быть быстрее, чем sed
, заключается в том, что вы можете воспользоваться дополнительными знаниями, которые у вас есть о ваших потребностях в обработке (sed
должен учитывать обобщенную обработку, поэтому может быть медленнеечто).
Не забывайте мантру оптимизации: "Измеряй, не угадывай!"
Если ты действительно Если вы хотите сделать эту строку по одной в bash
(и я все еще утверждаю, что это плохая идея), вы можете использовать:
pax> line=123456789abc
pax> line2=${line%%???}
pax> echo ${line2}
123456789
pax> _
Возможно, вы также захотите выяснить, действительно ли вы нужно улучшение скорости.Если вы обработаете строки как один большой блок, вы увидите, что sed
достаточно быстро.Введите следующее:
#!/usr/bin/bash
echo This is a pretty chunky line with three bad characters at the end.XXX >qq1
for i in 4 16 64 256 1024 4096 16384 65536 ; do
cat qq1 qq1 >qq2
cat qq2 qq2 >qq1
done
head -20000l qq1 >qq2
wc -l qq2
date
time sed 's/...$//' qq2 >qq1
date
head -3l qq1
и запустите его.Вот вывод на моем (совсем не очень быстром) ноутбуке R40:
pax> ./chk.sh
20000 qq2
Sat Jul 24 13:09:15 WAST 2010
real 0m0.851s
user 0m0.781s
sys 0m0.050s
Sat Jul 24 13:09:16 WAST 2010
This is a pretty chunky line with three bad characters at the end.
This is a pretty chunky line with three bad characters at the end.
This is a pretty chunky line with three bad characters at the end.
Это 20000 строк в секунду, довольно хорошо для того, что выполняется только каждый час.