1

Есть ли способ сделать что-то вроде этого:

cat somefile.txt | sort | uniq > somefile.txt

Т.е. Я хочу перечислить весь файл, затем направить некоторые действия к его содержимому и, наконец, вернуть результат обратно в исходный файл, полностью его перезаписав. Сейчас я делаю это, помещая вывод во временный файл и в конце концов перемещая его поверх исходного. Я хочу сделать это таким простым способом, каким позволяет Linux-трубопровод.

Shell это bash в Linux и cmd в Windows, если это важно.

2 ответа2

2

(отвечая за Баш)
Нет. Сначала оболочка обрабатывает перенаправления, а затем усекает файл. Только после этого запускается cat , и он работает с пустым файлом.

В пакете sponge есть инструмент moreutils который позволяет вам сделать это:

cat somefile.txt | sort | uniq | sponge somefile.txt

Эта команда может быть упрощена (удалить UUOC):

sort -u somefile.txt | sponge somefile.txt

Без sponge вы должны записать во временный файл, и если команда выполнена успешно, перезапишите входной файл

tmpfile=$(mktemp)
sort -u somefile.txt > "$tmpfile" && mv "$tmpfile" somefile.txt
0

Вы можете использовать Vim в режиме Ex:

ex -sc 'sort u|x' somefile.txt
  1. sort u сортировать

  2. x сохранить и закрыть

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .