bash sed script kálvária

 ( bugos | 2017. május 21., vasárnap - 13:56 )

Parancssorból sikerült összehoznom a kívánt végeredményt, de amikor scriptből szeretném futtatni, akkor hibát jelez.

$ echo "ABC/DEF"|sed -e "s/\//\"'\\\\\/'\"/g"
ABC"'\/'"DEF

A script pedig így nézne ki:

#!/bin/bash

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin

szoveg="ABC/DEF"
out=`echo "${szoveg}"|sed "s/\//\"'\\\\\/'\"/g"`
echo ${out}

Futtatáskor pedig ezt írja:

sed: -e kifejezés #1, karakter 11: Ismeretlen `s' opció

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Bash manpage a következőket írja a command substitution különböző szintaktikáival kapcsolatban:

Idézet:
When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by $, `, or \. The first backquote not preceded by a backslash terminates the command substitution. When using the $(command) form, all characters between the parentheses make up the command; none are treated specially.

Nagyon köszönöm, ez meg is oldotta a gondomat:

out=$(echo "${szoveg}"|sed "s/\//\"'\\\\\/'\"/g")

De ez is működött volna:

out=`echo "${szoveg}"|sed "s/\//\"'\\\\\\\\\\/'\"/g"`

Magam előtt sem világos pontosan, hogy miért. Kicsit olyan, mint az eval, hogy kétszer megy rajta végig a shell, s így minden escape-elt backslash-ből egy darab marad, másodjára is feleződik, ezen felül a sed-nek is kell az escape-elés, így kell aztán csak ehhez 8 darab.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

1638

~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack

:)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

#!/bin/sh

szoveg="ABC/DEF"
out=`echo "${szoveg}"|sed 's,\/,\"\\\\/\",g'`
echo ${out}

Kicsit olvashatóbb, ha a /-jel helyett más karaktert választasz elválasztónak (vagy mi is a pontos neve). A sed esetén inkább az aposztrófot (') választom, mint az idézőjelet ("), hogy a shell tuti ne akarja változtatni ("védjem a shelltől").

$ echo \\
\
$ echo "\\"
\
$ echo '\\'
\\
$ echo '\'
\
$ echo '\"'
\"

like

+1