У меня есть следующие: param="/var/tmp/test"
Мне нужно заменить слово test
с другим словом, такие как new_test
Замена последнего слова в пути с использованием СЭД
нужен умный способ заменить последнее слово после «/» с СЭД
У меня есть следующие: param="/var/tmp/test"
Мне нужно заменить слово test
с другим словом, такие как new_test
Замена последнего слова в пути с использованием СЭД
нужен умный способ заменить последнее слово после «/» с СЭД
Распаковка биты и куски с 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
echo 'param="/var/tmp/test"' | sed 's/\/[^\/]*"/\/REPLACEMENT"/'
param="/var/tmp/REPLACEMENT"
echo '/var/tmp/test' | sed 's/\/[^\/]*$/\/REPLACEMENT/'
/var/tmp/REPLACEMENT
и если я хочу получить только тестовое слово? yael – yael
Извините, я не уверен, что вы понимаете под «получить тестовое слово» –
Вам не нужно sed
для этого ... basename
и dirname
являются лучшим выбором для сборки или разборки пути доступа. Все эти символы побега дают мне головную боль ....
param="/var/tmp/test"
param_repl=`dirname $param`/newtest
, пожалуйста, см. Следующую ошибку sed Мне нужно использовать «для того, чтобы установить $ DIRNAME DIRNAME =/var/tmp echo/var/tmp/test | sed "s/\/[^ \ /] * $/\/BACKUP.DIR. $ DIRNAME/g" sed: -e выражение # 1, char 27: Неизвестная опция to 's ' – yael
Yup, это ошибка. Чтобы исправить это, используйте что-то другое, кроме sed. :-) –
Это не ясно, является ли 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}"
OK, но мне также нужно объяснить о sed! . */!!; s/"$ // синтаксис как это работает? – yael
Это может сработать для вас:
echo 'param="/var/tmp/test"' | sed -r 's#(/(([^/]*/)*))[^"]*#\1newtest#'
param="/var/tmp/newtest"
, пожалуйста, объясните -> sed' s!. */!!; s /" $ // синтаксис THX – yael
@yael: Это две отдельные подстановки, разделенные точкой с запятой. Второе просто удаляет конечный '' '. Первый использует альтернативный разделитель синтаксиса ('! '), Который соответствует * максимальному * числу символов до'/'(то есть от начала до последнего такого символа) и заменяет с пустой строкой.Мы знаем, что она максимальна, потому что двигатель RE подходит с жадностью. Удалите все до последней косой черты и любой завершающей цитаты, и у вас есть 'test'. –