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

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

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

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

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

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

  • Выполните одну из многих подстановок во многих файлах в двух определенных местах
  • Получение источника как Flatfile и удаление возврата каретки и \ n ... специальные символы?
  • Добавить столбец в таблицу
  • Лучший способ удалить строки из файла, где соответствующий текст (не целая строка) существует в другом файле
  • Упорядочить текстовый файл одним словом в строке
  • Случайно удалено из файла
  • Как заменить другой текст на одну строку из csv?
  • Сценарирование машинного текста
  • 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 - лучшая ОС в мире.