В простом английском я хочу извлечь часть строки, которая лежит
до первой запятой. Поскольку я планирую извлечь в будущем
конкретное имя файла строки, я не могу положиться на команду вырезать (я
в конечном итоге придется использовать команду sed
)
Строка ввода
ERROR 1: /home/rphillips/Desktop/empties/BN23_2303.tif, band 1: Failed to compute statistics, no valid pixels found in sampling.
Ожидаемые результаты
ERROR 1: /home/rphillips/Desktop/empties/BN25_2303.tif
Прежде чем мы выясним возможные причины, по которым ваша команда sed
не работает, давайте рассмотрим вашу настоящую проблему выше. Если вы просто хотите извлечь текст перед первой запятой, тогда все, что вам нужно:
sed 's/,.*//'
(который просто говорит, что удалите все от первой запятой до конца)
Вы также можете использовать обратную ссылку (которая пригодится для достижения конечной цели извлечения имени файла), например,
sed 's/^\([^,][^,]*\).*$/\1/'
(где указано '^'
начинаться с начала, \([^,][^,]*\)
захватывать весь текст не менее 1 символа, не являющегося запятой, и включать ноль или более дополнительных символов, не являющихся запятыми, .*$
отбрасывать весь текст в конец и \1
замена только захваченным текстом с использованием обратной ссылки)
Чтобы достичь цели извлечения только имени файла, вам нужно только изменить вышеприведенное, чтобы начать захват с первой косой черты, например,
sed 's/^[^/]*\([^,][^,]*\).*$/\1/'
Пример использования / Вывод
$ sed 's/^[^/]*\([^,][^,]*\).*$/\1/' <<< $name
/home/rphillips/Desktop/empties/BN23_2303.tif
Я не уверен, что это заставляет выражение не распознаваться
sed -e
sed
без опции -E
(--regexp-extended
) использует регулярные выражения Basic (без учета просмотра или опережения).
Если вы планируете использовать оставшиеся поля значений, разделенных запятыми, вы можете рассмотреть awk
для анализа полей. Вы можете легко получить все поля, указав -F
разделитель полей и простой цикл.
$ awk -F', ' '{for (i = 1; i <= NF; i++) printf "field %d - %s\n", i, $i}' <<< $name
field 1 - ERROR 1: /home/rphillips/Desktop/empties/BN23_2303.tif
field 2 - band 1: Failed to compute statistics
field 3 - no valid pixels found in sampling.
(вы также можете обрабатывать дальнейшие разборы каждого поля с помощью условия в цикле)
In Bash - расширения параметров - все, что вам нужно
Чтобы не упускать из виду лес для деревьев, так как вы указали bash
, если вы просто хотите извлечь имя файла из name
, все, что вам нужно, это расширение параметра с удалением подстроки ( сначала справа, а затем слева), например
tmp=${name%%,*} ## trim to (and including) the 1st comma from the right
echo "/${tmp#*/}" ## trim to and including the first / from the left
/home/rphillips/Desktop/empties/BN23_2303.tif
(гораздо более эффективный способ)
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.