Hej, mam problem ze zrozumieniem escapowania znaków w sed.
Weźmy na początek prosty przykład:
cho aaa | sed 's/$/b/g'
Wynik to aaab
- prosta sprawa.
Drugi przykład:
echo aaa | sed 's/$/\\/g'
Wynik to aaa\
. Pierwszy \
escapuje drugi \
. Analogicznie tutaj:
echo aaa | sed 's/$/\\\\/g'
Wchodzi aaa\\
, bo pierwszy \
escapuje drugi \
, a trzeci czwarty.
Nie kumam natomiast sytuacji, gdy wyrażenie do seda podane jest w "
zamiast '
.
To jest niepoprawne:
echo aaa | sed "s/$/\\/g"
żeby poprawić, trzeba dodać dodać trzeci \
, bo jest to znak specjalny w Bashu:
echo aaa | sed "s/$/\\\/g"
Wynik to ponownie aaa\
Jak te backslashe są po kolei interpretowane? Czemu dodanie czwartego \
nic nie zmienia a dodanie piątego oraz szóstego powoduje, że wyrażenie jest niepoprawne? Dopiero siedem \
daje dwa backslashe na wyjściu (aaa\\
).
Próbowałem to przeanalizować na prostszym przykładzie:
echo aaa | sed "s/$/\\b/g"
daje aaab
, a to:
echo aaa | sed "s/$/\\\b/g"
daje aaa\b
.
Z tego wydaje mi się, że pierwsze dwa \\
escapują następny znak. Ale to nie sprawdza się, gdy po \\
znajduje się znak specjalny basha, czyli na przykład \
albo $
:
echo aaa | sed "s/$/\\\$/g"
teraz w wyniku nie pojawia się znak po pierwszym \\
: aaa$
a nie aaa\$
Jest ktoś w stanie mi to rozrysować? :)