OSX

#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'