2015-05-06 4 views
1

Я пытаюсь сделать некоторое обходное решение для решения проблемы.Вставить строку после совпадения в переменной

У нас есть программа gtk +, которая вызывает сценарий bash, который вызывает rdesktop. В машине мы обнаруживаем, что вызов rdesktop требует дополнительного параметра ... Так как я ничего не написал об этом коде, и я могу изменить часть GTK проблемы, я могу только отредактировать скрипт bash, который делает средний вызов между вызовами.

У меня есть переменная CMD с чем-то, что выглядит как:

rdesktop -x m -r disk:USBDISK=/media -r disk:user=/home/user/ -r printer:HP_Officejet_Pro_8600 -a 16 -u -p -d -g 80% 192.168.0.5 

мне нужно «жить редактировать» эту строку, когда существует параметр принтера, он добавляет = «MS Publisher фотонаборном» после того, как принтер имя.

Лучший я accompplish до сих пор

[email protected] ~ $ input="rdesktop -x m -r disk:USBDISK=/media -r disk:user=/home/user/ -r printer:HP_Officejet_Pro_8600 -a 16 -u -p -d -g 80% 192.168.0.5" 
[email protected] ~ $ echo $input | sed s/'printer:.*a /=\"MS Publisher Imagesetter\" '/ 

которые возвращают меня:

rdesktop -x m -r disk:USBDISK=/media -r disk:user=/home/user/ -r ="MS Publisher Imagesetter" 16 -u -p -d -g 80% 192.168.0.5 

Почти, но мне нужно добавить строку, а не заменять его.

help?

Редактировать: я вставил незавершенные образцы. фиксированной

Edit2: С помощью того, кто ответит, я в конечном итоге с

echo "$input" | sed 's/\(printer:\)\([^ ]*\)/\1\2="MS Publisher Imagesetter"/' 
+0

Использование захвата группы '()' 'как '/\(printer:.*\)/\1=\"MS Издательство фотонаборном \» /' ' –

ответ

1

Если вы хотите, чтобы результат выглядел следующим образом: rdesktop -xm -r disk: USBDISK =/media -r disk: user =/home/user/-r printer: "HP_Officejet_Pro_8600 MS Publisher Imagesetter" -a 16 - u -p -d -g 80% 192.168.0.5

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

input="rdesktop -x m -r disk:USBDISK=/media -r disk:user=/home/user/ -r printer:HP_Officejet_Pro_8600 -a 16 -u -p -d -g 80% 192.168.0.5"

echo "$input" | sed 's/\(printer:\)\([^ ]*\)/\1"\2 MS Publisher Imagesetter"/' 

выход:

rdesktop -x m -r disk:USBDISK=/media -r disk:user=/home/user/ -r printer:"HP_Officejet_Pro_8600 MS Publisher Imagesetter" -a 16 -u -p -d -g 80% 192.168.0.5

+0

Acctualy, что должно быть вставка = «MS Publisher Imageetter» после имени принтера, но теперь просто вопрос переупорядочивания \ 2 :) THX !! – Techmago

+0

@Techmago Это на самом деле слишком сложно. Вам не нужны группы захвата, еще раз проверьте мой ответ. Он делает то же самое - без захвата групп. – hek2mgl

+0

@Techmago Yea, который должен это делать. Гибко знать, как использовать шаблоны удержания для манипулирования текстом, в этом случае вы также можете, вероятно, упростить его, если хотите, - например: «echo» $ input »| sed 's/принтер: [^] */"= MS Publisher Imagesetter"/'' –

1

Вы можете использовать это:

sed 's/printer:[^=]\+=/\0 "MS Publisher Imagesetter"/' <<< "$input" 

\0 в схеме замещения выводит сам матч.

+0

прилагаемой строки должны быть после принтера: something = «MS Publisher Imagesetter» , если бы я мог просто положить конец строки, wold будет много esier (echo $ {input} "random text") – Techmago

+0

@Techmago Хорошо, получилось. Я отредактировал свой ответ. Теперь он должен работать. – hek2mgl

+0

отсутствует {? – Techmago

Смежные вопросы