Извлечь все до строки соответствия

У меня есть строка

hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/ 

и я хочу просто

 hdfs://ussbssn01.us.xyz.com// 

Я попробовал awk, sed, но я не получил то, что ожидал, потому что строка совпадения // повторялась. Есть ли способ получить желаемый результат?

  • Добавить строку в начало второй строки, используя unix
  • Скребок из приложений, отличных от браузеров, на Debian Jessie
  • Удалите N-ю строку из обоих файлов, если строка в одном файле соответствует
  • Как извлечь строку между Nth и Mth вхождениями шаблона?
  • Как прокомментировать строки, соответствующие шаблону во всех файлах папки
  • sed / awk / perl / etc: перемещение строк назад в файл
  • сопоставить первый столбец файла a с параграфами файла b
  • объединить содержимое двух файлов с суммированием содержимого столбца 2?
  • 3 Solutions collect form web for “Извлечь все до строки соответствия”

    Чтобы получить первые две строки со строками соответствия:

     $ s=hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/ $ echo "$s" | awk -F// '{print $1 FS $2 FS}' hdfs://ussbssn01.us.xyz.com// 

    Как это работает:

    • -F//

      Это говорит awk использовать // как разделитель полей.

    • print $1 FS $2 FS

      Это говорит awk для печати первого поля, разделителя полей, второго поля и другого разделителя полей.

    альтернатива

    Чтобы получить все, вплоть до последней строки:

     $ echo "$s" | awk -F// '{$NF=""} 1' OFS=// hdfs://ussbssn01.us.xyz.com// 

    Как это работает:

    • -F//

      Это говорит awk использовать // как разделитель полей для ввода .

    • $NF=""

      Это говорит awk, чтобы заменить последнее поле пустой строкой.

    • 1

      Это критическая стенограмма awk для печати-записи.

    • OFS=//

      Это говорит awk использовать // как разделитель полей для вывода .

    с grep

     $ grep -o '^.*//.*//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/" hdfs://ussbssn01.us.xyz.com// $ grep -oP '^.*?//.*?//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/" hdfs://ussbssn01.us.xyz.com// $ grep -oP '^.*?com//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/" hdfs://ussbssn01.us.xyz.com// 
    • Первый работает, если есть только два набора //
    • Второй выберет до второго набора //
    • Третий работает, если требуемая строка заканчивается com//

    Редактировать:

    Как указывает @ilkkachu, [^/]* (ноль или более символов, кроме / ) могут использоваться вместо .*? во втором случае. Пример:

     $ grep -o '^[^/]*//[^/]*//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa//" hdfs://ussbssn01.us.xyz.com// 

    Если у вас есть строка в переменной оболочки var , в ksh или bash :

     $ var="hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/" $ printf "%s\n" "${var%//*}" hdfs://ussbssn01.us.xyz.com 

    Подстановка переменной ${var%suffix} будет отсекать suffix от значения var .

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