1

Попытка очистить переменную PYTHONPATH которая имеет общий синтаксис:

/a/path:/another/path/:/one/more/path

Я хочу удалить все пути, начинающиеся с /mnt . Сначала попробуйте с sed:

sed 's,/mnt/[^:]\+:,,g' <<< $PYTHONPATH

Он удаляет все вхождения, начинающиеся с /mnt/ , за которыми следуют один или несколько символов, кроме двоеточия и последующего символа двоеточия.

Это, однако, не удастся для следующего примера:

PYTHONPATH="/mnt/first/path:/mnt/second/path"

потому что второй путь не заканчивается двоеточием. Я не мог родить ничего лучше, чем запустить другой поиск с немного другим условием:

sed 's,/mnt/[^:]\+:,,g;s,/mnt/.*$,,g' <<< $PYTHONPATH

Так что теперь, после удаления всех вхождений, заканчивающихся двоеточием, другой прогон удаляет все вхождения (на самом деле их не более одного), которые начинаются с /mnt/ и заканчиваются концом строки.

Вопросы:

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

Заранее спасибо!

3 ответа3

2

Как указывает Argonauts, вы можете сделать это в одной строке с оператором OR. Вам не обязательно использовать опцию -r , но команда sed будет немного более сложной, так как вы должны избегать скобок и строки, как показано ниже:

sed 's,/mnt/[^:]\+\(:\|$\),,g' <<< "$PYTHONPATH"

Обратите внимание, что хорошей практикой является использование переменных в bash.

1

Вы можете использовать расширенные регулярные выражения с sed, чтобы немного упростить ситуацию:

sed -r 's,/mnt/[^:]+(:|$),,g' <<< $PYTHONPATH

-r указывает на использование расширенного регулярного выражения, которое в данном случае является оператором OR (:|$) , в результате чего он завершает сопоставление с образцом либо в двоеточии, либо в конце строки.

Примечание: в версиях sed для OS X и BSD используйте -E вместо -r

И хотя это, вероятно, ослепительно очевидно, если вы пытаетесь обновить сам PYTHONPATH, вам нужно присвоить значение после удаления записей /mnt /*:

export PYTHONPATH=$(sed -r 's,/mnt/[^:]+(:|$),,g' <<< $PYTHONPATH)
1

То, что у вас есть, приемлемо, но еще более простой и ленивый выход:

Просто создайте новую переменную

NEWVAR="${PYTHONPATH}:"
sed 's,/mnt/[^:]\+:,,g' <<< $NEWVAR

Предполагая, что вы назначаете это переменной и хотите снова обрезать добавленное двоеточие, с помощью манипуляции с переменной bash вы можете сделать это:

newvar="${PYTHONPATH}:"
nomnt=$( sed 's,/mnt/[^:]\+:,,g' <<< $newvar )
nomnt=${nomnt%%:}
echo ${nomnt}

Или во всех седах

sed 's,/mnt/[^:]\+:,,g;s/:$//;' <<< "${PYTHONPATH}:"

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