нужно понимать использование «/» в команде 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.

  • Почему пустая выгрузка этого `sed ... << END_SED | вырезать ... `?
  • Shell Script для удаления двойных кавычек в пределах значения столбца
  • Сопоставьте целое слово (IP-адрес) с помощью `sed`
  • Как исправить непревзойденное количество блоков в 2 столбцах
  • Вывести только определенные поля
  • sed insert в начале нескольких файлов не работает
  • Заменить «o» на «0» в большом списке слов и сохранить исходное слово?
  • Добавление последовательных символов для дублирования слов в соответствии с порядком их появления
  • 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. 
    Linux и Unix - лучшая ОС в мире.