как удалить две косые черты в комментарии с sed

3

У меня есть файл конфигурации, и я хочу заменить строку, содержащую определенную строку, скажем test :

file.conf

aaa
bbb
ccc
// test
ddd
// test

Моя строка кода не работает, я новичок в sed .

sed -i 's#^//[ \t]test#test#g'

Некоторые рекомендации?     

задан neuraload 30.01.2013 в 13:23
источник

2 ответа

3

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

Это рабочая версия того, что вы пытались выполнить и вышла на стандартный вывод (терминал):

sed 's#^//[ \t]test$#test#g' file.conf
aaa
bbb
ccc
test
ddd
test

Опционально пропустите его через меньшее, добавив | less , чтобы иметь возможность разбивать страницы на большие объемы вывода.

Вышеприведенное все очень специфично для последовательности test , поэтому для более обобщения вы можете попробовать следующее:

sed 's#^//\s\(.*\)$##g' file.conf

Он удалит часть // и любые пробелы до фактического текста, независимо от этого текста.

Если вам нравится результат, вы можете добавить флаг -i еще раз, чтобы заменить файл.

Подробнее о вашей попытке и объясните, почему мой пример работает:

sed -i 's#^//[ \t]test#test#g'
  • Вы используете обратную ссылку ('), которая интерпретируется вашей оболочкой, а не Sed. Здесь должна была использоваться простая одинарная кавычка ( ' ).
  • Хеши ( # ) - ваш выбранный разделитель, хорошая альтернатива общей косой чертой ( / ), так как совпадение относится к этому же символу, и это позволяет избежать необходимости экранирования.
  • Шаблон в команде s/regexp/replacement/ является стандартным, как указано в man-странице, среди многих других: man 1 sed :

      

    s/regexp/replacement/      

    Попытка совместить регулярное выражение с шаблоном   пространство. В случае успеха замените эту часть, соответствующую замене.   Замена может содержать специальный символ & , чтобы ссылаться на это   часть пространства шаблона, которое соответствовало, и специальные escape-последовательности    через , чтобы обратиться к соответствующему совпадению   подвыражения в регулярном выражении.

  • rexexp в приведенном выше примере является обычно используемой аббревиатурой регулярных выражений .
  • Регулярное выражение ^//[ \t]test$ соответствует строкам, начинающимся ( ^ ), с двумя косой чертой, а затем пробелом или символом табуляции, за которым следует точная последовательность test и завершение строки ( $ ).
  • Флаг g должен выполнить эту операцию глобальным способом, как описано здесь .
  • Отсутствует входной файл и должен быть указан после команды Sed.
ответ дан gertvdijk 30.01.2013 в 13:34
источник
2

Вы можете не использовать разделители в качестве разделителя. Фактически, я рекомендую использовать другие разделители, такие как запятая или хеши для удобства чтения.

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

sed -r 's,^//[ \t]*(.+),,' file.conf | less

Я использую -r здесь для расширенного регулярного выражения, поэтому мне не нужно выходить из круглых скобок. Кроме того, это позволяет мне использовать оператор «плюс», что означает «одно или несколько вхождений». Следующее выражение будет эквивалентным:

sed 's,^//[ \t]*\(..*\),,' file.conf | less

(одна точка, чтобы соответствовать хотя бы одному символу, за которым следует ноль или более любого символа)

После того, как я уверен, что замена правильная (введите слэш, за которым следуют ваши ключевые слова в less для поиска), я закрываю меньше, набрав q и перейдите к предыдущей записи истории, нажав клавишу Up. Затем я удаляю | less и набираю -i , чтобы продолжить замену:

sed -r 's,^//[ \t]*(.+),,' file.conf -i

Если вы хотите получить более глубокое понимание sed, я могу порекомендовать вам прочитать информационную страницу sed, которая более расширена, чем справочная страница:

info sed
    
ответ дан Lekensteyn 30.01.2013 в 14:32