2014-12-20 4 views
1

Я очень новичок в SED, и мне тяжело пытаться добавить конец каталога. То, что я делаю, включает в себя две основные вещи с помощью sed, но по какой-то причине никаких изменений не происходит после запуска сценария. Я покажу сегменты своего сценарияSed append to end of line directory

У меня есть сценарий bash, который вытаскивает мой домашний каталог с хоста, и я определяю переменную ID.

USERNAME="test" 

#pull the home directory 
dir=$(ssh -n -t $SERVERNAME "echo \$HOME";)  

приведенный выше пример будет хранить/экспорт/дом/ID в переменной

echo $dir | sed 's/\([/export/home]*\).*/\1/' > olddir  

СЕПГ команды dir выше магазинов/экспорта/дома/в файле olddir (взлетает окончание)

sed -i 's_/home/$ _\$USERNAME_' olddir  

я сейчас пытаюсь изменить /export/home/ к /export/home/test используя определенную переменную с экранированием $.

после запуска сценария он по-прежнему имеет /export/home/ в качестве записи в файле olddir. Я использую -i, чтобы изменить файл, и я думаю, что правильно использую разделители. что я могу делать неправильно? я даже снял $ из переменной USERNAME, которая ничего не делала. Я знаю, что мне не хватает чего-то маленького, но я просто не могу понять. Я очень ценю ваше время, чтобы ответить на мой вопрос.

+1

Зачем вам нужен вспомогательный файл? из вашей переменной 'dir' вы можете получить то, что хотите, в переменной' newdir' так: 'newdir = $ {dir%/*}/$ USERNAME'. Теперь причиной отказа является то, что вы используете одинарные кавычки: bash запрещает расширение переменных в одинарных кавычках. Вместо этого: 'sed -i 's_/home/$ _'" $ USERNAME "'_' olddir' должен работать. –

ответ

0

После использования предоставленной информации и играть с кодом , Я нашел решение, которое будет работать для ситуаций/export/home/ID и/home/ID.

Я использовал и Xorg, и предложения gniourf_gniourf, и ниже - мой результат.

echo $dir | sed 's_\([/export/home\]*\).*_\1_' > olddir 

Приведенный выше код является первой частью моего решения. Я использовал то, что Xorg предоставил для вышеуказанного кода, но похоже, что мне нужны эти [], поэтому я могу использовать *\, если у меня его echo $dir | sed 's_\(/export/home\).*_\1_' > olddir, тогда файл olddir будет содержать /export/home/ID/test после использования следующей команды sed.

Вот следующая СЕПГ команда, которую я использовал:

sed -i 's_/home_&/'"$USERNAME"'_' olddir 

Приведенный выше код является второй частью моего решения. Я подумал, что мне действительно нужно только сосредоточиться на/home /, поскольку я добавляю его после него. Я просмотрел комментарий gniourf_gniourf и использовал пример, в котором кавычки выделяют $USERNAME с "", который, похоже, позволяет сценарию использовать $ USERNAME как переменную, а не просто помещать символы $USERNAME.

поэтому после запуска сценария, в зависимости от хоста, у меня либо есть export/home/test/, либо /home/test/ Теперь я могу поместить любой из них в новую переменную скрипта, чтобы использовать для указания домашнего каталога при создании идентификаторов на удаленных хостах!

newdir="$(cat olddir)" 

Огромное спасибо всем вам за помощь. Я бы не смог понять это без вашей помощи.

Update: оказывается, что traling/в конце каталога является проблемой, так что я нашел гораздо более простой способ, чтобы заменить ID в домашнем каталоге

newdir="${dir/ID/${USERNAME}}"

я использовал их, если statments для как домашние справочные ситуации

`if [[$ dir =="/home/dhabinsk "]]; то NEWDIR = "$ {реж/dhabinsk/$ {USERNAME}}" фи

if [[ $dir == "/export/home/dhabinsk" ]]; then 
    newdir="${dir/dhabinsk/${USERNAME}}" 
fi` 

веселит

+0

..You приветствуются .. – repzero

+1

Извините за мусор в своем предыдущем комментарии, но я cannto отредактировал его уже (через 5 минут). Это решение может работать для вашего особого случая, но, как правило, неправильно. Ваша первая команда ищет не выражение "/ export/home/", но для нескольких букв в любом конкретном порядке. Убедитесь, что он будет соответствовать«/home/em/», например, не отбрасывая последнюю часть. –

0

Я думаю, что ваша командная строка может быть изменена затем перенаправить вывод olddir следующим образом:

echo $dir | sed 's#\(/export/home\).*#\1#' > olddir  

добавить USERNAME ПЕРЕМЕННОЙ

sed -i "s#/export/home#&/$USERNAME#" olddir 
+0

Привет, Xorg. Я попробовал то, что вы предоставили, и я делаю успехи благодаря вашей помощи. на данный момент, после того, как я использовал ваш 'sed -i 's_/export/home _ &/$ USERNAME_' olddir', но теперь он помещает' $ USERNAME' не значение переменной, а буквальные символы $ USERNAME в поле после/home /. '/ export/home/$ USERNAME' Я даже попытался сбежать из' '' в USERNAME, что не повлияло, и я использовал вашу альтернативную команду для перенаправления вывода с тем же результатом. Однако я нашел решение после игры. Я буду публиковать его. –

+0

вместо использования 's_/export/home _ &/$ USERNAME_' использовать "s_/export/home _ &/$ USERNAME_" с двойными qoutes, это позволит bash заменить вашу переменную скрипта на sed. – repzero