Используя sed для замены строки многими специальными символами?

Страница Вы ссылаетесь (http://intgat.tigress.co.uk/rmy/uml/index.html) на состояния:

The utility also works on ext3 or ext4 filesystems.

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

Обратите внимание, что zerofree утилита отличается от zerofree патча ядра, который упоминается на той же странице (который действительно, кажется, не имеет версию для ext4).

Обновление: По крайней мере, в случае VirtualBox, я не думаю, что Вам нужна эта утилита вообще. В моем тестировании, на запасе установка Ubuntu 10.04 на ext4, можно просто обнулить файловую систему как так:

$ dd if=/dev/zero of=test.file

... ожидайте виртуального диска для заполнения, затем

$ rm test.file

и выключенный VM. Затем на Вашем хосте VirtualBox сделайте:

$ VBoxManage modifyhd --compact yourImage.vdi

и Вы восстановите все неиспользуемое место.

2
26.05.2011, 23:30
2 ответа

Попробуйте это:

sed -i.bak "s:^.*\(\$cache_directory = \)\('./cache'\):\1$new_cache_directory:" infile
5
27.01.2020, 21:53
  • 1
    Это работало за одним исключением, переменная $new_cache_directory не была передана infile. Это показывает $cache_directory = '$new_cache_directory'; –  jason.dot.h 26.05.2011, 08:59
  • 2
    @Jason: хорошо. каков Ваш ожидаемый вывод? –  Prince John Wesley 26.05.2011, 09:04
  • 3
    Это - интерактивный сценарий, таким образом, пользователь определяет $new_cache_directory с помощью printf, и читать... В основном переменная должна быть передана файлу. Таким образом, если они отвечают на whackachuck, именно это показывает файл. Это является немного более описательным? –  jason.dot.h 26.05.2011, 09:12
  • 4
    @Jason: ответ является updated.removed обратной косой чертой прежде $new_cache_directory –  Prince John Wesley 26.05.2011, 09:13
  • 5
    Спасибо, Вы просто побеждаете меня к нему! Спасибо за всю Вашу справку! –  jason.dot.h 26.05.2011, 09:21

Таким образом, я предполагаю, что Вы хотите заменить 'кэш' содержанием упомянутой переменной, не с ее именем:

sed 's#^$cache_directory = ../cache.;#$cache_directory = '$new_cache_directory'#' script.php

Таким образом, у Вас есть различные проблемы для решения: Обычно sed управляет, чтобы наклонные черты использования разделили части: 's/foo/bar / '. При контакте с путями это является тревожащим, но мы можем использовать много разделителей - они просто неявно объявляются в следующем'.

Проблема 2 подобна. Мы часто указываем команду в одинарных кавычках:

sed 'command' file 

Но здесь у нас есть апострофы приблизительно./кэшир - что сделать? Одна идея была бы, для использования

sed "command" file 

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

sed s/standart/standard/g sample.txt 

но снова, у Вас есть $cache_directory как переменная в команде, которая была бы интерпретирована. Таким образом, я просто заменяю апострофы знаком шутника, точкой, и был бы действительно удивлен, если некоторое другое выражение будет соответствовать той части: ../cache. как xy/cachei - не очень вероятный, не так ли?

Но Вам нравится, когда $new_cache_directory заменяется содержанием переменной, таким образом, я выключаю маскирование с = ', вставьте переменную и включите маскирование снова для окончания команды с '# '.

2
27.01.2020, 21:53
  • 1
    Спасибо за хорошо объясненный мыслительный процесс, я действительно ценю его, когда люди не торопятся для через объяснения чего-то. Однако тот метод не работал. это отобразило вывод файла в терминале. –  jason.dot.h 26.05.2011, 08:52
  • 2
    Хорошо - для генерации файла Вы обычно используете sed 'cmd' file.in > file.out, но заменять файл, Вы используете sed -i 'cmd' file. Но последние работы только однажды, таким образом, я думал, что требуется сохранить источник и знать о передаче по каналу вывода где-нибудь. –  user unknown 26.05.2011, 15:38

Теги

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