linux - Konvertere mellem Windows og Unix-bane med sed tab dobbelt skråstreg

Indlæg af Hanne Mølgaard Plasc

Problem



Denne kommando giver mig næsten det, jeg vil have: -


echo "\123.123.123.123path11 - path2path3 path4path5" | sed 's\_\\_/\_g' | sed 's\_ \_\ \_g'
/123.123.123.123/path1/1 - path2/path3 path4/path5


Men som man kan se, mistede den '//' i begyndelsen!

dvs. ønsket udgang: -


//123.123.123.123/path1/1 - path2/path3 path4/path5


Hvad mangler jeg?





Rediger: Efter ikke at have testet det grundlæggende i echo (mange tak til alle, der påpegede det). Jeg burde også have været mere klar på slutspillet af dette spørgsmål.


Jeg vil bruge dette i et script, og definer windows-stien øverst.

Hvordan kan jeg echo stien til en tmp-fil til sed?

Dette vil naturligvis ikke arbejde:


WIN\_PATH="\123.123.123.123path11 - path2path3 path4path5"
UNIX\_PATH=`echo $WIN\_PATH | sed 's\_\\_/\_g' | sed 's\_ \_\ \_g'`

Bedste reference


Brug enkelt citater i stedet for dobbelt citater i echo - som det er skallen fortolker dine to backslashes som en flugtsekvens for :


$ echo '\123.123.123.123path11 - path2path3 path4path5' | sed 's\_\\_/\_g' | sed 's\_ \_\ \_g'
//123.123.123.123/path1/1 - path2/path3 path4/path5


Brug af enkelt citater undertrykker shelludvidelser (for eksempel variabler) og deaktiverer de fleste flugtsekvenser.

Andre referencer 1


Dit problem er, at i \ allerede er escape secuence for , så du allerede har mistet en af ​​echo.
Du kan bare prøve:


echo "\123.123.123.123path11 - path2path3 path4path5" 


at se det.


Du er nødt til at undslippe dem for at få det til at fungere, dvs.


echo "\\123.123.123.123path11 - path2path3 path4path5" | sed 's\_\\_/\_g' | sed 's\_ \_\ \_g'
//123.123.123.123/path1/1 - path2/path3 path4/path5

Andre referencer 2


Bash bruger \ (backslash) som en flugt. Det bliver ikke munched af sed, men ved bash, før du sender strengen til echo. Prøv:


echo "\123"


Du får:


123


For at løse dit problem skal du sætte din tekst i en fil og læse den derfra for at undgå, at skal slippe ud:


$ cat >file
\123.123.123.123path11 - path2path3 path4path5
$ cat file | sed 's\_\\_/\_g' | sed 's\_ \_\ \_g'
//123.123.123.123/path1/1 - path2/path3 path4/path5

Andre referencer 3


hvis du vil gøre det, brug enkelt citater, så skråstreget ikke bliver fortolket.


echo '\123.123.123.123path11 - path2path3 path4path5'