Комбинация команды Sed удара Unix на одном файле

"Выразительная часть" ресурса аккумулятора легче, я использовал бы byobu или подобную утилиту для этого. Эти менеджеры являются великими в этом, они разделят сессии от терминалов, что означает, что можно даже запустить работу в DE в byobu, затем просто убить DE и продолжить в tty.

Или можно реализовать это в оболочке (взгляды $PS1 и функция удара).

Для мчащейся части, для закрытия средств DE закрыть все программы, работающие в этом, которое может означать потерю данных. Это может рассматриваться как причина, почему Вы должны базироваться доступ.

Однако, если Вы действительно хотите это и хотите смочь сделать это быстро в любое время, можно записать сценарий для этого, "дать" его, чтобы базироваться и установить бит setuid так, чтобы, если кто-либо запускает этот конкретный скрипт, он работал как корень без дальнейшей аутентификации. Что делает, это немного более сложное - то, что некоторые дистрибутивы не позволят Вам сделать это со сценариями. Это может быть решено путем создания обертки C, которая будет exec сценарий для Вас и использования та обертка вместо этого.

Я, вероятно, пошел бы с этим подходом плюс, рассматривают дополнительные функции как не уничтожение, если работал из DE, ничего не убив сразу (как период 60-х) или отображение его к ключу в Byobu.

4
02.04.2015, 11:47
2 ответа

Если нет никаких шансов, что какой-либо из символов <> | может встретиться в данных, которые вы хотите сохранить в своем файле, то почти наверняка наиболее эффективным решением будет просто tr и полностью удалите их:

tr '<>|' '   ' <infile |    ###translate all delimiter chars to spaces
tr -s ' '     >outfile      ###pipe results to second tr and squeeze spaces

sed может работать и для вас, но если это так, то почти наверняка это будет медленнее. Вы должны быть осторожны при работе с входными файлами, не основанными на \ n разделителях ewline, и с использованием инструментов, предназначенных для обработки данных с разделителями \ n ewline, разделенных (например, sed и grep ) , потому что некоторые реализации могут потерпеть неудачу при нагрузке на буфер.

Ваша проблема не в (пока) , хотя: скорее вы отправили неверный синтаксис в виде команды sed . @Archemar уже прокомментировал, что это такое, но вот почему:

A sed s /// ubstitution - это команда, состоящая из трех полей:

  1. the s командный примитив, за которым следует разделитель (обычно / )
  2. поле шаблона регулярного выражения, за которым следует тот же разделитель
  3. поле замены, за которым следует разделитель и необязательные флаги

Один или оба последних могут иметь нулевую длину по разным причинам - и поэтому s /// является (зависит от контекста) приемлемым синтаксисом. Это означает, что синтаксический анализатор sed должен очень сильно зависеть от разделителя.В вашей команде вы указываете слишком много полей - это синтаксическая ошибка, и поэтому ваша функция не может быть проанализирована .

Если ваша реализация sed может обрабатывать однострочный ввод и совместима с POSIX, тогда это должно работать вместо этого:

sed 'y/<>|/   /;s/  */ /g' <infile >outfile

... где примитив y выше - Собственная tr функция анслитерации sed .

1
27.01.2020, 20:57

Попробуйте так:

sed -e 's:<>\s\|.*:Replaced:g' filename

Результат выглядит следующим образом:

$ echo "<> |" | sed -e 's:<>\s\|.*:Replaced:g'
Replaced

Если вы просто хотите удалить его, удалите слово Заменено из команды.

Если между символами < и > имеется пробел, следует заменить <> на <\s>.

После обновления вопроса:

$ cat filename
  > Test Item|Test Item
  < Test Item|Test Item

$ cat filename | sed -E 's:[<>]\s(.*)\|(.*)$:\1 \2:g'
  Test Item Test Item
  Test Item Test Item
2
27.01.2020, 20:57

Теги

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