2010-05-30 2 views

ответ

1

Распаковка биты и куски с sed несколько хаотично (как говорит Джим Льюис, использовать basename и dirname, если вы можете), но по крайней мере вы не нужен избыток обратной косой черты, чтобы сделать это, если вы собираетесь на sed маршрут, так как вы можете использовать тот факт, что символ-разделитель по выбору (я люблю использовать ! когда / слишком неудобно, но это произвольная):

$ echo 'param="/var/tmp/test"' | sed ' s!/[^/"]*"!/new_test"! ' 
param="/var/tmp/new_test" 

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

$ echo 'param="/var/tmp/test"' | sed ' s!.*/!! ; s/"$// ' 
test 
+0

, пожалуйста, объясните -> sed' s!. */!!; s /" $ // синтаксис THX – yael

+0

@yael: Это две отдельные подстановки, разделенные точкой с запятой. Второе просто удаляет конечный '' '. Первый использует альтернативный разделитель синтаксиса ('! '), Который соответствует * максимальному * числу символов до'/'(то есть от начала до последнего такого символа) и заменяет с пустой строкой.Мы знаем, что она максимальна, потому что двигатель RE подходит с жадностью. Удалите все до последней косой черты и любой завершающей цитаты, и у вас есть 'test'. –

2
echo 'param="/var/tmp/test"' | sed 's/\/[^\/]*"/\/REPLACEMENT"/' 
param="/var/tmp/REPLACEMENT" 

echo '/var/tmp/test' | sed 's/\/[^\/]*$/\/REPLACEMENT/' 
/var/tmp/REPLACEMENT 
+0

и если я хочу получить только тестовое слово? yael – yael

+0

Извините, я не уверен, что вы понимаете под «получить тестовое слово» –

0

Вам не нужно sed для этого ... basename и dirname являются лучшим выбором для сборки или разборки пути доступа. Все эти символы побега дают мне головную боль ....

param="/var/tmp/test" 
param_repl=`dirname $param`/newtest 
+0

, пожалуйста, см. Следующую ошибку sed Мне нужно использовать «для того, чтобы установить $ DIRNAME DIRNAME =/var/tmp echo/var/tmp/test | sed "s/\/[^ \ /] * $/\/BACKUP.DIR. $ DIRNAME/g" sed: -e выражение # 1, char 27: Неизвестная опция to 's ' – yael

+0

Yup, это ошибка. Чтобы исправить это, используйте что-то другое, кроме sed. :-) –

0

Это не ясно, является ли param часть строки, что вам нужно переработанные или это переменная, которая содержит строку. Предполагая, что последнее, что вы можете сделать это, используя только Bash (вы не говорите, какую оболочку вы используете):

shopt -s extglob 
param="/var/tmp/test" 
param="${param/%\/*([^\/])//new_test}" 

Если param= является частью строки:

shopt -s extglob 
string='param="/var/tmp/test"' 
string="${string/%\/*([^\/])\"//new}" 
+0

OK, но мне также нужно объяснить о sed! . */!!; s/"$ // синтаксис как это работает? – yael

0

Это может сработать для вас:

echo 'param="/var/tmp/test"' | sed -r 's#(/(([^/]*/)*))[^"]*#\1newtest#' 
param="/var/tmp/newtest" 
Смежные вопросы