Введите содержимое файла, передайте некоторые действия и верните результат обратно

268
Alex G.P.

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

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

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

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

1

2 ответа на вопрос

2
glenn jackman

(отвечает за bash)
Нет. Оболочка сначала обрабатывает перенаправления, а затем усекает файл. Только после этого 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 
`sponge` является общим ответом, но поскольку` sort` (в отличие от большинства утилит) должен буферизовать все данные перед выводом любых (кроме `-m`), для этого конкретного случая вы можете вместо этого` sort -u -o somefile .txt somefile.txt`. dave_thompson_085 8 лет назад 1
0
Steven Penny

You can use Vim in Ex mode:

ex -sc 'sort u|x' somefile.txt 
  1. sort u sort unique

  2. x save and close

Похожие вопросы