Символ відповідності або кінець рядка з sed


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. Чи можливе тут одне рішення пошуку? Просто цікаво.

Спасибі заздалегідь!

Відповіді:


2

Як вказували аргонавти, ви можете зробити це в одному рядку з оператором OR. Не обов’язково використовувати цей -rпараметр, але sedкоманда буде трохи складнішою, оскільки вам доведеться уникати круглих дужок і рядка так:

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

Зауважте, що це хороша практика цитувати змінні в bash.


Це не спрацювало для мене на MacOS. Подолали це шляхом встановлення та використання GNU sed.
Фліппі Босман

1

Те, що у вас є, є прийнятним, але ще простішим, лінивим виходом є:

Просто зробіть нову змінну

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

Якщо припустити, що ви присвоюєте цю змінну, і хочете, щоб додана двокрапка знову була оброблена, маніпулюючи зміною bash, ви можете це зробити:

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

Або у всіх sed:

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

1

Ви можете використовувати розширені регулярні вирази з sed, щоб трохи спростити речі:

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

-rВказує на використання розширеного регулярний вираз, яке в даному випадку є твердження або (:|$), змушуючи його закінчити пошук по шаблоном або на товстій кишці або в кінці лінії.

Примітка: для OS X та BSD версії sed використовують -Eзамість-r

І хоча це, мабуть, сліпо очевидно, якщо ви намагаєтесь оновити сам PYTHONPATH, вам потрібно призначити значення після видалення записів / mnt / *:

export PYTHONPATH=$(sed -r 's,/mnt/[^:]+(:|$),,g' <<< $PYTHONPATH)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.