1

У меня есть массив, содержащий строки, которые состоят из путей к файлам в следующем формате:

/ Путь / к / файлу / 14561234545_50303.текст

Я пытаюсь выбрать раздел после "1", но перед "_", чтобы он выглядел как 4561234545. Я пытался сделать это с помощью sed, но до сих пор не смог получить только этот раздел.

Может ли кто-нибудь помочь дать мне пример того, какое выражение мне нужно было бы использовать только для этого раздела?

3 ответа3

0

Ваш вопрос немного не указан, но вот краткое решение с использованием sed (вы сказали sed, верно? ;-))

input='/path/to/file/14561234545_50303.TXT'
section=`basename $input | sed 's/^1\([^_]\+\).*/\1/'`

Разъяснение:

  1. вытащить имя файла с basename (я думаю, вам нужно выполнить извлечение только на части имени файла)
  2. выполнить Sed Match следующим образом:
    1. ^1 : соответствует 1 в начале строки (опять же, догадка, адаптируйтесь по своему вкусу)
    2. \( [^_]\+ \) : (пробелы добавлены для ясности) соответствуют последовательности из одного или нескольких ( \+) символов, которые не соответствуют подчеркиванию, и сохраните эту последовательность в \1
    3. .* : сопоставить все остальное, что следует (начиная с подчеркивания _ если ваш ввод правильно сформирован)
  3. замените сопоставленный текст (который является всей строкой, если ваш ввод правильно сформирован!) с последовательностью символов подчеркивания, которая была извлечена в шаге 2.2

Вы действительно должны включить .* В конце матча, чтобы использовать оставшуюся часть ввода. Если вы этого не сделаете, замена на шаге 3 будет действовать только на часть строки, ведущую к подчеркиванию, и вы будете удивлены, обнаружив, что ваш вывод почти идентичен вводу, за исключением 1 .

0

Допустим, ваш путь хранится в path переменной bash, используйте оператор полосы строк bash, чтобы разделить до самых дальних символов «/1». Затем awk, чтобы распечатать до _ char.

echo $ {path ## */1} | awk -F_ '{print $ 1}'

0

Вы можете использовать расширение параметров bash для всех элементов массива:

$ paths=( /path/to/file/14561234545_50303.TXT /a/b/1ABCD_foo "/x/y/12 3 4 5_.e_f_g" )
$ new=( "${paths[@]##*/1}" )
$ new=( "${new[@]%%_*}" )
$ printf "%s\n" "${new[@]}"
4561234545
ABCD
2 3 4 5

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .