нужно понимать использование «/» в команде sed

Я хочу понять команду sed

Например, у меня есть команда:

rtNum=`pwd | sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//'` 

а также

 rtRun=`pwd | sed -e 's/^.*bbsp.\/rt.*\///'` 

где pwd: /tfsrun/bbsp2/rt3/run он выводит результат следующим образом:

 echo $rtNum 3 

а также

 echo $rtRun run 

Я хочу понять вышеприведенную команду sed, особенно использование -e и использование / 's, // и /// в приведенной команде sed.

3 Solutions collect form web for “нужно понимать использование «/» в команде sed”

Как указано в руководстве, параметр -e указывает, что следующий сценарий. Ваш скрипт заменяет соответствующий контент пустой строкой, используя регулярное выражение.

Чтобы понять регулярные выражения, я рекомендую потратить достаточное количество времени, например, https://www.tutorialspoint.com/unix/unix-regular-expressions.htm

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

например, 's/matchingstring/targetstring/' вызывает замену первого вхождения matchstring с targetstring.

В твоем случае:

  • '//' означает, что targetstring пуст, поскольку между разделителями нет ничего
  • '///' самом деле есть '\///' что означает, что matchstring заканчивается косой чертой, а targetstring пуст.

Флаг -e для sed – это способ сказать «выполнить / запустить это». Это необходимо, если вы хотите запустить несколько команд редактирования sed в том же вызове sed (если только вы не разделите их).

Например, для извлечения / печати только строк 1 и от 20 до 30 из файла (флаг -n отключает вывод по умолчанию для каждой строки ввода):

 $ sed -n -e '1p' -e '20,30p' 

В sed одиночные косые черты ( / ) используются для разграничения регулярных выражений.

Например, удаляя все строки, содержащие строку «привет», а затем «слово» позже в той же строке:

 $ sed '/hello.*world/d' 

Иногда вы можете видеть двойную косую черту в подстановках. Команда s в sed выполняет замену того, что соответствует регулярному выражению со строкой:

 s/pattern/replacement/ 

Если намерение состоит в том, чтобы удалить предмет, соответствующий шаблону, замена будет пустой, и мы закончим с

 s/pattern// 

Тройная косая черта ( /// ) происходит от кого-то, пытающегося удалить шаблон, заканчивающийся косой чертой . Поскольку в качестве разделителей используются косые черты, вы также заметите, что первая косая черта сбрасывается с помощью обратного слэша ( \/ ), образующего \/// . «Escaped» означает «сделанный рассматриваться как буквальный символ, а не как разделитель».

Есть несколько других способов обойти неудобные косые черты при выполнении замены в sed . Возьмите замену

 s/\/// 

Это удаляет первый / на каждой строке (фактически ничего не заменяет ).

Альтернативой является запись

 s/[/]// 

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

Другой подход заключается в использовании другого разделителя:

 s#/## 

Здесь символ # принимает роль разделителя (можно выбрать любой символ). Чтобы соответствовать # при использовании # в качестве разделителя, нужно использовать либо \# либо [#] , как это было необходимо делать при использовании разделителя по умолчанию / разделителя.

Итак, глядя на командную строку sed

 sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//' 

Это выполняет две операции редактирования:

  1. s/^.*bbsp.\/rt// или s#^.*bbsp./rt##
  2. s/\/.*$// или s#/.*$##

Оба являются подстановками (команда редактирования s в sed ), и оба заменяют шаблон, который он соответствует ни с чем, т.е. они оба удаляют что-то из ввода.

Первый шаблон: ^.*bbsp.\/rt и будет совпадать с началом строки ( ^ ), любым числом любых символов ( .* ), За которым следует строка bbsp , за которой следует какой-то другой символ ( . ) И строка /rt .

Таким образом, похоже, что он удалит все на линии до и bbsp. /rt после bbsp. , где . представляет любой символ.

Второй шаблон, \/.*$ , будет соответствовать \/.*$ после / до конца строки ( $ ).

Так что с учетом строки текста

 /tfsrun/bbsp2/rt3/run 

Первая замена превратит ее в

 3/run 

а вторая превратит его в

 3 

Здесь вы цитируете man sed

-e script, –expression = script

  add the script to the commands to be executed 

s / регулярное выражение / замена /

  Attempt to match regexp against the pattern space. If successful, replace that portion matched with replacement. The replacement may contain the special character & to refer to that portion of the pattern space which matched, and the special escapes \1 through \9 to refer to the corresponding matching sub-expressions in the regexp. 
  • Более сжатые методы для обертывания файла, чем использование sed
  • Замените обратную косую черту sed
  • Как распознать, какой символ ASCII в шестнадцатеричном состоянии?
  • Поиск и удаление строк, содержащих несколько шаблонов в файле
  • Sed: изменить каждое повторение не первого слова для каждого слова в тексте
  • Как пропустить файл в sed, если он содержит регулярное выражение?
  • Как обмениваться словами в имени файла с помощью оболочки?
  • Как заменить теги html командой SED?
  • sed на вставке OSX на определенной строке
  • как заменить выражение sed / perl (изменить и распечатать только согласованную строку) с выражением python?
  • Как выполнить замену на месте, которая создает только резервные копии файлов, которые были изменены?
  • Печатать строки, если шаблон не сопоставляется
  • Interesting Posts

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

    Remap Caps Lock для «A» без отправки письма дважды

    Как установить PHP CLI с помощью интерактивной подсказки на Debian Wheezy?

    Есть ли идиоматическая переменная для исполняемого терминала в Linux?

    Могу ли я сделать обратный traceroute?

    dbclient – логин без ввода пароля вручную

    Каким будет пакет RHEL, соответствующий встроенному в Ubuntu?

    Как я могу извлечь данные из этой строки?

    Отрицательный GID в / etc / passwd?

    Более высокий уровень судо, убивающего PID

    Разница между пользователем sudo и пользователем root

    target / build CFLAGS mixup при перекрестном появлении из-за ошибки или моей глупости?

    Как отобразить размер каждого файла рядом с ним после выполнения команды «locate»?

    Должен ли я постоянно отключать сторожевой таймер NMI или нет?

    Звук Ubuntu не работает после сна / приостановки

    Linux и Unix - лучшая ОС в мире.