bash sed script kálvária

Fórumok

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ások

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

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.

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

#!/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 '\"'
\"