Проверьте свой рабочий каталог, возможно, у вас есть файл с именем result}
, созданный
sed -r -e '/^[a-z]/{s/^.*$/(&)/; w result' -e '}' test
Существуют разные способы обхода проблемы, один из них — использование опции -e
для разделения команд. Когда используется w
, все символы после него используются для имени файла и, следовательно, почему вы получили ошибку, поскольку {
не имеет конечной пары
Дополнительная литература:Руководство GNU sed :Команды, требующие перехода на новую строку
Просто выполнение пары локальных тестов показывает, что команда sed h file >> destination
примерно на 66% быстрее, чем cat
вам придется немного переписать свой скрипт, чтобы добавить вторую команду, потому что sed
принимает только один аргумент файла но в любом случае получилось быстрее.
РЕДАКТИРОВАТЬ :В тестах использовались файлы объемом 4 ГБ со случайным текстом и количеством символов Юникода, которые измерялись с помощью команды time
.
Мой старый ноутбук с жестким диском примерно в два раза быстрее вашего тайминга.
Я подозреваю, что вы используете cat из BusyBox, а не только оптимизированную подставку -cat.
Я проверил тайминги в четырех командах, и все они вышли в одном и том же шаре -парке (с погрешностью 10% ). Я использовал GNU cat, sed, awk и dd. Я очищал кеши перед каждым тестом (в другом окне как sudo )с:echo 3 > /proc/sys/vm/drop_caches
.
sed (случайно )обрабатывает несколько входных файлов.
$ time cat Timer1 Timer2 > Timer3
real 1m57.536s
user 0m0.072s
sys 0m20.456s
$
$ time sed -e '1n' Timer1 Timer2 > Timer3
real 1m54.450s
user 0m15.924s
sys 0m23.420s
$
$ time awk 1 Timer1 Timer2 > Timer3
real 2m0.080s
user 0m21.752s
sys 0m21.444s
$
$ time { cat Timer1 > Timer3
> dd status=none conv=notrunc oflag=append bs=100M if=Timer2 of=Timer3
> }
$
real 2m9.426s
user 0m0.012s
sys 0m18.260s
$
$ ls -lh Timer?
-rw-r--r-- 1 paul paul 17 Mar 7 11:01 Timer1
-rw-r--r-- 1 paul paul 3.7G Mar 7 11:03 Timer2
-rw-r--r-- 1 paul paul 3.7G Mar 7 11:50 Timer3
$
$ ls -l Timer?
-rw-r--r-- 1 paul paul 17 Mar 7 11:01 Timer1
-rw-r--r-- 1 paul paul 3942530050 Mar 7 11:03 Timer2
-rw-r--r-- 1 paul paul 3942530067 Mar 7 12:06 Timer3
Это говорит о том, что время зависит от производительности ввода-вывода, а используемая команда имеет гораздо меньшее значение. (Использование цикла чтения командной оболочки по-прежнему не лучшая идея.)
Примечательно, однако, что cat и dd занимают гораздо меньше времени пользователя, чем инструменты редактирования.