Я хочу использовать sed, чтобы закомментировать определенную команду в js-файле. Команда называется processLoad(..). Я пришел с выражением ниже, но оно не делает то, что я ожидаю. Компьютер, на котором я работаю, принадлежит моему провайдеру, поэтому я не знаю версию linux, работающую на этом компьютере. [Добавлено:]

sed -r -i 's_^\([ \t]+processLoad.*\)$_//\1_' test.txt

Я надеюсь заменить строку:

     processLoad('mystr');

в

//     processLoad('mystr')

Я выяснил, что «/» в качестве замещающего символа разделения может создать проблемы с // в качестве комментариев, поэтому я выбираю _ в качестве замещающего символа разделения.

4 ответа4

2

Попробуйте sed '/^[[:space:]]*processLoad/s!^!//!'


Первая часть /^[[:space:]]*processLoad/ ограничивает действия только строками, соответствующими этому шаблону. Вторая часть s!^!//! Это знаменитый поиск и замена sed: найдите начало строки (^) и замените его двумя слешами. Я использую челку (s!!!) вместо обычных слэшей, поэтому мне не нужно избегать буквальных слэшей в замещающей строке. Для более подробной информации, смотрите man-страницу sed.

1

Вам нужен расширенный флаг регулярного выражения (-r)?

С этим флагом ваше регулярное выражение пытается сопоставить литерал (и), а не сохранять совпадение.

Единственное различие между базовыми и расширенными регулярными выражениями заключается в поведении нескольких символов: «?», «+», Скобок и фигурных скобок («{}»). Хотя базовые регулярные выражения требуют их экранирования, если вы хотите, чтобы они вели себя как специальные символы, при использовании расширенных регулярных выражений вы должны избегать их, если вы хотите, чтобы они соответствовали буквальному символу.

Расширенная ссылка на регулярные выражения

1

Возможно, вам следует изменить + на * в случае, если processLoad происходит в начале строки.

Если processLoad(...) может происходить в середине строки, вам понадобится довольно другое выражение.

0

Выражение ниже решило это, для меня это работает на Debian Linux и Mac OS X (BSD), хотя \1 нужно заменить на $1 . Раздражает, что sed сильно отличается на разных платформах.

`sed -e 's_^\([ \t]*processLoad(\)_//\1_' -i -- test.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .