#macos #sed
Вопрос:
У меня есть каталог, содержащий тысячи txt-файлов. Мне нужно обрезать файлы, чтобы каждая строка после строки 25 в каждом файле удалялась. Я использую Mac OSX 10.14.6.
Как я могу это сделать?
Попытки, которые я предпринял
После исследования я думаю, что SED в терминале Mac OSX — лучший способ сделать это.
На этой странице приведены примеры того, как ориентироваться на строки в SED. Поэтому я думаю, что команда SED, которая мне понадобится, это:
sed '1,25!d'
Это говорит SED удалить все, кроме строк с 1 по 25. Когда я пробую это на одном файле, это работает.
Теперь мне нужно расширить его, чтобы он работал с каталогом файлов.
В этом ответе говорится, что я могу сделать это, используя флаги SEDs-n и-i (в нем также упоминается флаг-s, который не работает в OSX).
Поэтому я думаю, что код должен быть таким:
sed -n -i '1,25!d' *.txt
Но когда я пытаюсь это сделать, я получаю эту ошибку:
sed: 1: "filename": command a expects followed by text
Я пробовал другие варианты, но, похоже, ни один из них не работает.
Ответ №1:
macOS использует sed BSD, а не GNU sed: читать man sed
Для этого -i
параметра требуется аргумент в sed BSD. Если вам не нужна резервная копия файла, аргументом является пустая строка:
$ seq 50 | tee file1 > file2
$ wc file1 file2
50 50 141 file1
50 50 141 file2
100 100 282 total
$ sed -i '' -n '1,25p' file1 file2
$ wc file1 file2
25 25 66 file1
25 25 66 file2
50 50 132 total
Ответ №2:
Лучше использовать q
команду вместо d
того, чтобы для более быстрого выполнения и передавать ее find xargs
вот так:
cd some_dir
find . -type f -print0 | xargs -0 -n1 sed -i.bak '25q'