miit sed "/" durch "\/" ersetzen ??

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

miit sed "/" durch "\/" ersetzen ??

Beitrag von latenite » 02.10.2009 23:07:22

Hallo Leute

ich versteh hier was nicht. Ich möchte in einer Variable die einen Pfad als String enthält die "/" durch "\/" ersetzen.
Aber wenn ich das Ergebniss einer Variabl ezuweise bekomme ich eine Fehlermeldung:

Code: Alles auswählen

0:572:root@pendrive /media/disk/system_setup [0]# var='/mnt/new/path'
0:573:root@pendrive /media/disk/system_setup [0]# newvar=`echo ${path} | sed -e 's/n/b/g'`
0:574:root@pendrive /media/disk/system_setup [0]# echo $newvar
mbt/bew/das/weg
0:575:root@pendrive /media/disk/system_setup [0]# newvar=`echo ${path} | sed -e 's/\//\\\//g'`
sed: -e Ausdruck #1, Zeichen 9: unknown option to `s'
0:576:root@pendrive /media/disk/system_setup [1]# echo ${path} | sed -e 's/\//\\\//g'
mnt\/new\/das\/weg
0:577:root@pendrive /media/disk/system_setup [0]# 
Ich brauche den geänderten String mit "\/" statt nur "/" um ihn wieder in sed nutzen zu können.
Also so:

Code: Alles auswählen

#
echo "enter a path: "
read BUILDINGGROUND_MOUNTPOINT
substitute_text=`echo ${BUILDINGGROUND_MOUNTPOINT} | sed 's/\//\\\//g'`
substitute_line='8'
#eigendlich kommt die Zeilennummer hier her:
#substitute_line=$((`cat ${PATHPREFIX}/current_configs/current_table.txt | grep -n '## BUILDINGGROUND ##' | cut -d":" -f1`+1))
sed -i -e "${substitute_line}s/.*/${substitute_text}/" ${PATHPREFIX}/current_configs/current_table.txt
Noch geht weder die Variable ${substitude_line} in der letzen Zeile noch die Variable ${substitute_text}

Was mache ich da falsch?

Danke


Danke

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von GoKi » 02.10.2009 23:40:20

Ich würde da einfach mal ein nettes Feature von sed benutzen. Du musst nicht / benutzen...

Code: Alles auswählen

$ echo "/mnt/new/path" | sed -e 's:n:b:g'
/mbt/bew/path
$ echo "/mnt/new/path" | sed -e 's:n:b:g'
/mbt/bew/path
btw. http://sial.org/howto/shell/useless-cat/

Wobei da evtl. eh ed geeigneter ist, um an einer bestimmten Stelle in einer Datei etwas einzufügen.
MfG GoKi
:wq

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von gms » 02.10.2009 23:40:39

nachdem es so funktioniert:

Code: Alles auswählen

gms@gms1 ~ $ newvar=$(echo ${path} | sed -e 's/\//\\\//g')
gms@gms1 ~ $ echo $newvar
mnt\/new\/das\/weg
kann das eigentlich nur mit der Sonderbehandlung vom Backslash zu tun haben:
man bash hat geschrieben: When the old-style backquote form of substitution is used, backslash
retains its literal meaning except when followed by $, `, or \.
...
When using the $(command) form, all characters between the
parentheses make up the command; none are treated specially.
wenn ich den ersten Satz richtig interpretiere, muß der Backslash escaped werden, wenn nachfolgend ein $,` oder \ Zeichen folgt

Code: Alles auswählen

gms@gms1 ~ $ newvar=`echo ${path} | sed -e 's/\//\\\\\//g'`
gms@gms1 ~ $ echo $newvar
mnt\/new\/das\/weg
Gruß
gms


edit:
für solche simple Ersetzungen braucht man den sed eigentlich nicht zu bemühen:

Code: Alles auswählen

gms@gms1 ~ $ newvar=${path//\//\\\/}
gms@gms1 ~ $ echo $newvar
mnt\/new\/das\/weg

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von latenite » 03.10.2009 01:17:52

@ gms

Du hast die neue Variable so initialisiert:

Code: Alles auswählen

 newvar=$(echo ${path} | sed -e 's/\//\\\//g')
Ich so:

Code: Alles auswählen

 newvar=`echo ${path} | sed -e 's/\//\\\//g'`
Deine Synatx kannte ich bis heute gar nicht was bedeute das?
ich kenne

Code: Alles auswählen

${variable}
und

Code: Alles auswählen

`führe das hier aus und ersetze es durch die Ausgabe`
Warum hat meins nicht funktioniertß Wenn ich es ausführe kommt doch der string den ich will dabei raus?

Code: Alles auswählen

0:529:root@pendrive /media/disk/system_setup [0]# echo ${STRING} | sed -e 's/\//\\\//g'
\/mnt\/new\/path
0:530:root@pendrive /media/disk/system_setup [0]#
Und am aller wichtigsten -> was is das $() ? welche Funktion hat diese Syntax?

Und mal ein RIESEN "DAAAAAaaaaaNKE" an alle hier im Forum. Eure Hilfe ist echt goldwert!!! :D :D :D

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von gms » 03.10.2009 09:23:11

Die Syntax $(command) ist eine neuere Form von `command`. In dieser Form können die Kommandos auch leichter verschachtelt werden und der Backslash braucht keine Sonderbehandlung
latenite hat geschrieben: Warum hat meins nicht funktioniertß Wenn ich es ausführe kommt doch der string den ich will dabei raus?

Code: Alles auswählen

0:529:root@pendrive /media/disk/system_setup [0]# echo ${STRING} | sed -e 's/\//\\\//g'
\/mnt\/new\/path
0:530:root@pendrive /media/disk/system_setup [0]#
Bei Verwendung von Backticks müssen die Backslashes, also \-Zeichen, bei verschachtelten Kommandos escaped werden. In der neueren Form jedoch nicht:

Code: Alles auswählen

gms@gms1 ~ $ echo `echo \`date\``
Sam Okt 3 09:04:52 CEST 2009
gms@gms1 ~ $ echo $(echo $(date))
Sam Okt 3 09:04:59 CEST 2009
Daher muß die Shell innerhalb von Backticks unterscheiden können, ob ein Backslash als Escapezeichen oder als Literal zu betrachten ist. Daher muß der Backslash in den oben genannten Fällen ( wenn er von $, ` oder \ ) gefolgt wird und als Literal betrachtet werden soll eskaped werden.

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von latenite » 03.10.2009 23:05:33

Hi Leute

wenn ich in einem Script chroot nutze und dann in der neuen chrootumgebung ein weiteres script ausführen will, wie mache ich das dann?

Code: Alles auswählen

chroot /mnt/newsystem
cd /pfad/zum/script/in/der/chrootumgebung
./script.sh
das habe ich probiert...aber da wird nur chroot ausgeführt und dann war ' s das.

Danke für die Hilfe :)

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von Meillo » 03.10.2009 23:21:01

latenite hat geschrieben:wenn ich in einem Script chroot nutze und dann in der neuen chrootumgebung ein weiteres script ausführen will, wie mache ich das dann?

Code: Alles auswählen

chroot /mnt/newsystem
cd /pfad/zum/script/in/der/chrootumgebung
./script.sh
das habe ich probiert...aber da wird nur chroot ausgeführt und dann war ' s das.
Wie sieht dein Script aus? Denn da darf natürlich nur Zeug verwendet werden das in der chroot auch vorhanden ist. Alles außerhalb ist ja unsichtbar.

Teste lieber erst mal mit einer statisch gelinkten Executable, das ist der einfachste Fall. Sonst halt /bin in die chroot kopieren, oder was du halt so brauchst. Und auf $PATH achten, der muss passen.
Use ed once in a while!

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von latenite » 03.10.2009 23:49:12

Hi Meillo

Also mein script sieht so aus:

Code: Alles auswählen

#!/bin/bash
PATHPREFIX='./subscripts'
cat << EOF
################################################################################
# CHROOTING INTO NEW SYSTEM
################################################################################
EOF

BUILDINGGROUND=`cat ${PATHPREFIX}/current_configs/current_table.txt | grep -A1 '## BUILDINGGROUND ##' | tail -1 | sed 's/ //'`
echo $BUILDINGGROUND
NEWDATA=`cat ${PATHPREFIX}/current_configs/current_table.txt | grep -A1 '## NEWDATA ##' | tail -1 | sed 's/ //'`
echo $NEWDATA
MODE=$1
echo $MODE

function chrooting () {
MODE=$1
################################################################################
# adding /proc and /dev so we can act aks if we where alife
################################################################################
mount -o bind /dev ${BUILDINGGROUND}/dev
mount -t proc /proc ${BUILDINGGROUND}/proc
mount -o bind /sys ${BUILDINGGROUND}/sys

################################################################################
# move into our new nome :) and run "debootstrap_part_2.sh"
################################################################################

chroot ${BUILDINGGROUND} /usr/bin/env -i HOME=/root TERM=$TERM PS1='\u:\w\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash --login
echo $MODE
cd ${NEWDATA}/system_setup
./chroot_to_end.sh ${MODE}
} # end of chrooting
chrooting ${MODE}
und wenn ich es ausführe wird nach dem chroot leider nicht das in der chrootumgebung liegende "chroot_to_end.sh" script ausgeführt. Genau genommen macht er nach dem chroot GARNIX mehr.
Das Ls um zu zeigen das das Script vorhanden ist habe ich von hand gemacht:

Code: Alles auswählen

################################################################################
# CHROOTING INTO NEW SYSTEM
################################################################################
/mnt/newsystem
/root
UNATTENDED
mount: /proc already mounted or /mnt/newsystem/proc busy
mount: according to mtab, /proc is already mounted on /mnt/newsystem/proc
localhost:/# DAS HIER MACHE ICH _nicht_ DAS SCRIPT
bash: DAS: command not found
localhost:/# cd /root/system_setup/
localhost:~/system_setup# ls -l ./chroot_to_end.sh 
-rwxr-xr-x 1 root root 90 Oct  3 21:14 ./chroot_to_end.sh
localhost:~/system_setup# 

Danke :) :)

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von Meillo » 04.10.2009 00:22:25

latenite hat geschrieben:Danke :) :)
Danke nicht zu früh, denn ich muss jetzt leider passen. Chroot kenne ich nur theoretisch, habe aber keine praktischen Erfahrungen. Ich könnte jetzt nur noch raten.

Morgen hat dir bestimmt jemand handfeste Hilfe. :-)
Use ed once in a while!

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von latenite » 04.10.2009 00:50:35

:) oki :)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von gms » 04.10.2009 09:04:11

Dein Script läuft natürlich zu keiner Zeit im Kontext des Chroots. In diesem Kontext lauft nur der Prozeß, der vom "chroot" Kommando gestartet wird.

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von latenite » 04.10.2009 13:17:28

Kann ich dem chroot den Pfad zu einem Script in der chrootumgebung mitgeben und es unter chroot starten? Wenn ja, wie?
....lauft nur der Prozeß, der vom "chroot" Kommando gestartet wird.
Danke

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: miit sed "/" durch "\/" ersetzen ??

Beitrag von Meillo » 04.10.2009 14:33:40

latenite hat geschrieben:Kann ich dem chroot den Pfad zu einem Script in der chrootumgebung mitgeben und es unter chroot starten? Wenn ja, wie?
Hast du dir denn mal die Manpage angeschaut? Denn da steht das ganz deutlich drin.
Use ed once in a while!

Antworten