2010-12-30 6 views
0

Привет всем!Как манипулировать строкой, переменной в оболочке

У меня есть эта переменная в оболочке, содержащей пути, разделенные пространство:

LINE="/path/to/manipulate1 /path/to/manipulate2" 

Я хочу, чтобы добавить дополнительную строку пути в начале строки и так же сразу после места, так что переменная будет есть результат что-то вроде этого:

LINE="/additional/path1/to/path/to/manipulate1 /additional/path2/to/path/to/manipulate2" 

Я попытался это один, но получить только старые пути

#!/bin/bash 

LINE="/path/to/one /path/to/two" 
NEW_PATH=`echo $LINE | sed "s/^\([^ ]\+\) \([^ ]\+\)/\/add1\1 \/add2\2/"` 
echo "$NEW_PATH" 

Любая помощь приветствуется Спасибо заранее

+1

Так что вы хотите добавить? Что такое «путь1» в первом случае и «путь2» во втором случае? Или вы хотели добавить то же самое для обоих? – plundra

+0

Это не имеет значения, просто хочу знать, как добавить что-то перед строкой и что-то еще после пробела. – user558134

+0

Да, я получил его после перечитания. Еще не закончил утренний кофе. – plundra

ответ

1
firstPath=$(echo $LINE | cut -d' ' -f1) 
secondPath=$(echo $LINE | cut -d' ' -f2) 

firstPath="/additional/path1/to$firstPath" 
secondPath="/additional/path2/to$secondPath" 
+0

этот хорошо работает;) – user558134

+0

@ user558134: Помните о том, чтобы поддержать те ответы, которые полезны для вашей проблемы, а также отметить как принятый тот, который ее решает. ;) –

0
NEW_PATH=`echo $LINE | sed "s/^\([^ ]\+\) \([^ ]\+\)/\/add1\1 \/add2\2/"` 

результаты в new_path =

/add1/путь/к/manipulate1/add2/путь/к/manipulate2

+0

Можете ли вы избежать этих обратных шагов или использовать '$ (...)' – plundra

+0

спасибо, сделано :) – Ass3mbler

+0

Я пробовал этот: NEW_PATH = $ (echo $ LINE | sed "s/^ \ ([^] \ + \) \ ([^] \ + \)/\/add1 \ 1 \/add2 \ 2/"), но никакого нового пути – user558134

2

Это, курсы беспорядочны с любыми предыдущими аргументами, которые вам могут потребоваться.

set $LINE 
LINE="/additional/path1$1 /additional/path2$2" 

Протестировано в bash/dash/ksh.

Edit: Если сохранение исходных аргументов необходимо, это может быть полезно:

[email protected] 
<stuff from above> 
set $orig 
+0

Это хорошо работает;) – user558134

1
$ test="/sbin /usr/sbin /bin /usr/bin /usr/local/bin /usr/X11R6/bin" 

$ test2=$(for i in $test; do echo "/newroot${i}"; done) 

$ echo $test2 
/newroot/sbin /newroot/usr/sbin /newroot/bin /newroot/usr/bin /newroot/usr/local/bin /newroot/usr/X11R6/bin 
1

Поскольку вы используете Bash:

Если дополнения являются одинаковыми для каждого :

LINE="/path/to/manipulate1 /path/to/manipulate2" 
array=($LINE) 
LINE=${array[@]/#//additional/path/to/} 

Если они отличные:

LINE="/path/to/manipulate1 /path/to/manipulate2" 
array=($LINE) 
array[0]=/additional/path1/to${array[0]} 
array[1]=/additional/path2/to${array[1]} 
LINE=${array[@]} 

Или, более гибко:

LINE="/path/to/manipulate1 /path/to/manipulate2" 
array=($LINE) 
parts=(/additional/path1/to /additional/path2/to) 
if ((${#array[@]} == ${#parts[@]})) 
then 
    for ((i=0; i<${#array[@]}; i++)) 
    do 
     array[i]=${parts[i]}${array[i]} 
    done 
fi 
LINE=${array[@]} 
Смежные вопросы