2014-02-13 9 views
5

wenn ich Text wieBash Backslash vor jedem Leerzeichen hinzufügen?

/mnt/data/web/web content/page 1/home page.txt 

ich meinen Text mit dem folgenden Befehl erhalten, die dann an einem anderen Befehl geleitet wird.

cat somefile.txt | awk '{$1=$2=$3=$4=$5=$6=$7=$8=$9=$10=""; print $0}' 

Ich brauche den obigen Befehl in einer anderen Befehl zum Rohr der Rückseite schlitzt

hinzufügen Wie kann ich einen Backslash vor jedem Raum hinzufügen, damit ich richtig * nichts Wege

also erhalten.

Der Text könnte theoretisch unendlich lang sein, aber ich brauche immer einen Backslash vor jedem Leerzeichen. Endgültiges Skript ist in freebsd & verwendet linux

danke!

+2

Sie können den Pfad in Anführungszeichen setzen, dann müssen Sie keine Leerzeichen entfernen. z.B. 'rm/mnt/data/web/webcontent/page 1/home page.txt' wird scheitern, aber' rm "/ mnt/data/web/webcontent/page 1/home page.txt" 'wird wahrscheinlich was machen du willst – Mzzl

+0

Mein Text wird mit cat und einer awk-Anweisung in einer Reihe von Pipes gezogen Wie kann ich einfach Zitate um die Ausgabe hinzufügen? Hier ist der relevante Teil cat somefile.txt | awk '{$ 1 = $ 2 = $ 3 = $ 4 = $ 5 = $ 6 = $ 7 = $ 8 = $ 9 = $ 10 = ""; print $ 0} 'diese Ausgabe wird dann weitergeleitet, damit weitere Daten hinzugefügt werden können – JJD

+0

Ich habe geantwortet ... Funktioniert nicht? – MLSC

Antwort

6

Diese awk tun sollten:

awk '{gsub(/ /,"\\ ")}8' file 
/mnt/data/web/web\ content/page\ 1/home\ page.txt 
+0

darf ich fragen was macht die '8' am Ende? –

+0

Es tut dasselbe wie '1'. Jede positive Zahl wäre ein echter Test. Wenn der Test wahr ist, führen Sie die Standardaktion 'print $ 0' aus. Es druckt also nur alle Zeilen. – Jotne

2

Ist es nützlich für Sie?

echo "/mnt/data/web/web content/page 1/home page.txt" > input.txt 

dann:

sed 's/ \+/\\ /g' input.txt > output.txt 

dann:

cat output.txt 
/mnt/data/web/web\ content/page\ 1/home\ page.txt 

Wenn Sie für alle Räume tun möchten, können Sie versuchen, awk

mit awk:

awk -F" " '{ print $1"\\ " $2"\\ " $3"\\ " $4}' input.txt > output.txt 
+0

meine Frage aktualisiert, um den Befehl hinzuzufügen, den ich benutze, um den Text zu erhalten, wenn ich meinen Befehl in sed 's pipe | | \\ | ' Ich bekomme ein \ am Anfang jeder Zeile nicht vor den Leerzeichen – JJD

+0

ok Ich sah Ihre aktualisierten..Ich überprüfe – MLSC

+0

versuchen Sie mit Awk Lösung – MLSC

0

Sie benötigen gesamten Pfad zu zitieren:

# Create file 
echo Hi > "a file with spaces" 

# Try to cat it 
n="a file with spaces" 
cat $n 
cat: a: No such file or directory 
cat: file: No such file or directory 
cat: with: No such file or directory 
cat: spaces: No such file or directory 


# With quotes this time :-) 
cat "$n" 
Hi 
1

Dies könnte für Sie (GNU sed) arbeiten:

sed 's/\s/\\&/g' file 
0
# Wrap file path with "" so it can be treated as $1 
# Wrap command with "" if spaces are present to treat as $2 
# Wraping time only nessisay for pros ;-) $3 
# Example synax; 
# format_space_do_time "/dir with/sp ac e s" "Comand With options" "TimeToSleep" 
# Set $1, $2 and $3 variable names such that they can be hard-coded for debugging 
File_Path="$1" 
Commands="$2" 
Timed_Sleep="$3" 
format_space_do_time(){ 
# Check if services or command is already in proggress 
while true 
do 
    if ps ax | grep -v grep | grep "$Commands" > /dev/null 
    then 
    # Waite $Time_Sleep for $Commands to finish 
    sleep $Time_Sleep; 
    else 
    # $Commands not detected. Start'em now 
    for i in "$File_Path/"* 
    do 
     # Magic time, lets deal with spaces in $i and save it to $entry 
     # Option 1 replaces " " with "$'\0'" which is bashs way of dealing with spaces 
     entry1=$(echo "$i" | sed 's/ /$\'\\\0\'/g') 
     # Option 2 can be used to replace " " with "\ " of cource without the quotes around them :-) 
     entry2=$(echo "$i" | sed 's/ /\\\ /g') 
     # Clear previous outputs 
     clear 
     # run $Commands against $entry1 
     # Change 1 to 2 for the other option 
     ${Commands} "${entry1}" > /dev/null 
    done 
    fi 
done 
} 

Das obige Scrpt wurde von den folgenden hinzugefügt aufgrund Link

http://www.cenolan.com/2013/03/looping-video-playlist-omxplayer-raspberry-pi/

hatte sie etwas, das gut funktioniert, bis ich mit einem Gatesbox Benutzers Festplatte zu tun hatte. Ich persönlich benutze dieses Skript zum Abspielen von Musik und Filmen über die Befehlszeile. Zum Beispiel speichere ich das obige als omx_play_lister.sh dann chmod +x omx_play_lister und laufe mit;

./omx_play_lister "/media/mount/cWin/Music by artist/artist name and album folder" "omxplayer -ohdmi --vol=-2500" "5" 

Welches wird glücklich den Dateipfad nehmen; /media/mount/cWin/Music by artist/artist name and album folder und konvertieren zu /media/mount/cWin/Music\ by\ artist/artist\ name\ and\ album\ folder oder Nullbits im Falle von omxplayer und ls und viele andere, die nicht viel wie "um Sachen, wenn Dateipfade übergeben werden.Bonus des Verwendens des sed Befehls innerhalb des Blickes nahe dem Ende ist, dass, selbst wenn die Dateien selbst Räume enthalten, diese auch formatiert werden, bevor sie an die $Commands kleinen und "$File_Path/"* wo die schwierigsten Stücke der Formatierung übergeworfen werden, aber es funktioniert Gut für was ich es brauche und wahrscheinlich mit ein wenig Modifizierung wird auch für Ihre Verwendungen funktionieren.

Happy hacken und modding alles.

Verwandte Themen