Удаление пробелов между двумя словами ТОЛЬКО

Согласно документации, /proc/PID/pagemap содержит одно 64-битное значение для каждой виртуальной страницы.

При 4096-байтовых страницах и 64-битном виртуальном адресном пространстве имеется 2**52 страниц. Таким образом, полный файл pagemap будет состоять из 2**52 записей по 8 байт каждая. Это действительно большой файл. Чтобы все это вылечить, потребуется много времени. Не 2 минуты. Очень долгое время. Тест скорости на моем собственном компьютере показывает около 21 года.

И в основном он будет заполнен нулями (для всех виртуальных адресов, которые не отображаются в процессе). Куча вывода \0 на терминал не вызывает видимого эффекта. Он не завис, он делает то, что вы просили.

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

Правильный способ использования файла карты страниц — знать, какой виртуальный адрес вы ищете, найти его и прочитать 8 байтов.Или, если вам нужна информация для диапазона, прочитайте некоторое число, кратное 8 байтам. Если вам нужны все ненулевые записи, сначала прочитайте /proc/PID/maps, чтобы узнать, какие диапазоны отображаются.

0
20.06.2017, 13:10
3 ответа

GNUsedподход:

sed 's/\([^.]*\.[^."[:space:]]*\)[[:space:]]\+"/\1"/' file

  • \([^.]*\.[^."[:space:]]*\)- 1-я захваченная группа, содержащая гипотетическое имя файла с расширением

  • [[:space:]]\+"- гарантирует наличие хотя бы одного пробела между extensionи "

1
28.01.2020, 02:25

Вы можете сделать:

sed 's/\(\.[^"[:blank:]]*\)[[:blank:]]*"/\1"/g'

То есть удалить последовательность пробелов, следующих за . , за которым следует последовательность символов, не являющихся пробелами, или "и за которыми следует "

Чтобы удалить пробелы перед каждым другимсимволом двойной кавычки в каждой строке вы можете сделать что-то вроде:

sed 's/[[:blank:]]*"/"&/g
     s/\(\([^"]*"\)\{3\}\)[[:blank:]]*"/\1"/g
     s/"\([^"]*"\)/\1/g'

То есть:

  1. Вставить дополнительный "перед каждым <пробелы>"
  2. Изменить все "<пробелы>""<пробелы>"до "<пробелы>"""
  3. Удалите все остальные ", чтобы отменить вставки in 1

Или более простым способом с awk:

awk -F \" -v OFS=\" '
  {
    for (i = 2; i <= NF; i += 2 )
      sub(/[[:blank:]]*$/, "", $i)
    print
  }'

Обратите внимание, что trне будет сжимать символы, если вы не используете опцию -s. Скорее всего, вы забыли указать расширение параметра или подстановку команды, содержащую вывод tr.

В любом случае, trнельзя использовать для этой задачи. просто инструмент транслитерации.Все, что он может сделать, это перевести/удалить/сжать всесимволы пробела. Он не может переводить/удалять/сжимать только некоторыепробелы.

1
28.01.2020, 02:25

Использовать версию GNU. Найдите один или несколько пробелов, за которыми следует двойная кавычка. Замените это двойной кавычкой:

sed -i -e 's/ \+"/"/' file

или вот так, по вашему выбору:

sed -i -e 's/[[:space:]]\+"/"/' file
1
28.01.2020, 02:25

Теги

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