Как я могу использовать файл в команде и перенаправить вывод в тот же файл без его усечения?

В основном я хочу взять в качестве входного текста из файла, удалить строку из этого файла и отправить выход обратно в тот же файл. Что-то в этом направлении, если это делает его более ясным.

grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name > file_name 

однако, когда я это делаю, я получаю пустой файл. Есть предположения?

Вы не можете этого сделать, потому что bash сначала обрабатывает перенаправления, а затем выполняет команду. Итак, к тому времени, когда grep смотрит на имя_файла, он уже пуст. Тем не менее, вы можете использовать временный файл.

 grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name > tmpfile cat tmpfile > file_name 

например, рассмотрим возможность использования mktemp для создания tmp-файла, но обратите внимание, что это не POSIX.

Используйте губку для таких задач. Его часть moreutils.

Попробуйте эту команду:

  grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name | sponge file_name 

Вместо этого используйте sed:

 sed -i '/seg[0-9]\{1,\}\.[0-9]\{1\}/d' file_name 

попробуйте этот простой

 grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name | tee file_name 

На этот раз ваш файл не будет пустым 🙂 и ваш вывод также будет напечатан на вашем терминале.

Вы не можете использовать оператор перенаправления ( > или >> ) в тот же файл, потому что он имеет более высокий приоритет, и он будет создавать / обрезать файл до того, как команда будет даже вызываться. Чтобы этого избежать, вы должны использовать соответствующие инструменты, такие как tee , sponge , sed -i или любой другой инструмент, который может записывать результаты в файл (например, sort file -o file ).

В принципе, redirect ввода в тот же исходный файл не имеет смысла, и для этого вам следует использовать соответствующие редакторы на месте, например редактор Ex (часть Vim):

 ex '+g/seg[0-9]\{1,\}\.[0-9]\{1\}/d' -scwq file_name 

где:

  • '+cmd' / -c – запускать любую команду Ex / Vim
  • g/pattern/d – удалить строки, соответствующие шаблону, используя глобальные ( help :g )
  • -s – бесшумный режим ( man ex )
  • -c wq – execute :write and :quit команды

Вы можете использовать sed для достижения того же (как уже показано в других ответах), однако на месте ( -i ) нестандартное расширение FreeBSD (может работать по-разному между Unix / Linux), и в основном это s sream itor, а не редактор файлов. Смотрите: Имеет ли режим Ex практическое применение?

Одна альтернатива для линейки – задайте содержимое файла как переменную:

 VAR=`cat file_name`; echo "$VAR"|grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' > file_name 

Существует также ed (как альтернатива sed -i ):

 # cf. http://wiki.bash-hackers.org/howto/edit-ed printf '%s\n' H 'g/seg[0-9]\{1,\}\.[0-9]\{1\}/d' wq | ed -s file_name 

Вы можете сделать это с помощью замены процесса .

Это немного взломать, хотя bash открывает все трубы асинхронно, и мы должны работать, используя sleep поэтому YMMV.

В вашем примере:

 grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name > >(sleep 1 && cat > file_name) 
  • >(sleep 1 && cat > file_name) создает временный файл, который получает вывод grep
  • sleep 1 задержка на секунду, чтобы дать grep время для анализа входного файла
  • finally cat > file_name записывает вывод

Вы можете использовать slurp с POSIX Awk:

 !/seg[0-9]\{1,\}\.[0-9]\{1\}/ { q = q ? q RS $0 : $0 } END { print q > ARGV[1] } 

пример

Обычно я использую программу tee для этого:

 grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name | tee file_name 

Он создает и удаляет временный файл сам по себе.

Попробуй это

 echo -e "AAA\nBBB\nCCC" > testfile cat testfile AAA BBB CCC echo "$(grep -v 'AAA' testfile)" > testfile cat testfile BBB CCC 

возможно, вы можете сделать это следующим образом:

 grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name | cat > file_name 
  • Использование DNS для перенаправления на другой URL-адрес с помощью пути
  • redirect вывода в текстовый файл c #
  • Лучшая практика: 301 Перенаправление HTTP на HTTPS (стандартный домен)
  • Изменение пути поиска DLL для статической связанной DLL
  • Будет ли redirect 302 поддерживать строку-референт?
  • Переадресация авторизации при истечении срока действия сеанса не работает при отправке формы JSF, страница остается той же
  • Разница между кодами перенаправления HTTP
  • .htaccess переписать для перенаправления корневого URL в подкаталог
  • Gdb печатать в файл вместо stdout
  • Server.Transfer Vs. Response.Redirect
  • Заголовок ответа jQuery и AJAX
  • Давайте будем гением компьютера.