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

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

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

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

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

Я попробовал awk, 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 .

  • wc -L сообщает длину строки 8 для tab-char. ошибка или функция?
  • Упорядочить текстовый файл одним словом в строке
  • Добавление строки в таблицу
  • Добавить круглые скобки вокруг чисел
  • сканирование последовательности и вывод подпоследовательности
  • Как сравнить два файла по строкам, чтобы проверить, сколько из них перемещено вверх или вниз?
  • Добавить строку в начало второй строки, используя unix
  • извлечение подмножества строк из большого текстового файла
  • Выбирать и удалять строки, соответствующие шаблону из файла
  • Манипуляция текста: удаление значений x <= $ input из отсортированного списка и обобщения
  • Суммирование значений, если значение второго столбца
  • Linux и Unix - лучшая ОС в мире.