Замена последнего слова пути с помощью sed - PullRequest
1 голос
/ 30 мая 2010

У меня есть следующее: param="/var/tmp/test" Мне нужно заменить слово test другим словом, таким как new_test

нужен умный способ заменить последнее слово после "/" на sed

Ответы [ 5 ]

3 голосов
/ 30 мая 2010
echo 'param="/var/tmp/test"' | sed 's/\/[^\/]*"/\/REPLACEMENT"/'
param="/var/tmp/REPLACEMENT"

echo '/var/tmp/test' | sed 's/\/[^\/]*$/\/REPLACEMENT/' 
/var/tmp/REPLACEMENT
1 голос
/ 30 мая 2010

Извлечение битов и кусочков с помощью 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 голосов
/ 18 ноября 2011

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

echo 'param="/var/tmp/test"' | sed -r 's#(/(([^/]*/)*))[^"]*#\1newtest#'
param="/var/tmp/newtest"
0 голосов
/ 30 мая 2010

Не ясно, является ли 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 голосов
/ 30 мая 2010

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

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