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

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

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

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

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

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

  • Как закодировать скрипт по многим файлам?
  • команда для извлечения данных между двумя строками
  • Удалите дополнительные строки заголовков из файла, кроме первой строки
  • Печать всех N столбцов в новом файле
  • Выведите диапазон столбцов из файла, где диапазон задается двумя переменными
  • С помощью сценариев оболочки мне нужно объединить данные из двух файлов в один файл
  • Проблемы при объединении многих текстовых файлов рядом с пастой
  • AIX - нужно добавить строки после идентификации шаблона в файле с помощью Non-GNU - Sed
  • 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 - лучшая ОС в мире.