Bash + sed - escapowanie znaków

0

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ć? :)

0

By ułatwić odpowiedź, powiem że nie zależy to od żadnej specjalnej składni seda - ten tylko pragnie jednego argumentu, aby faktycznie jeden argument został dostarczony, należy zgrupować go apostrofami lub cudzysłowem. By ułatwić ogarnianie co się dzieje, spójrz na te przykłady używając tylko echo:

$ echo 's/$/\\/g'
s/$/\\/g
$ echo 's/$/\\\\/g'
s/$/\\\\/g
$ echo "s/$/\\/g"
s/$/\/g
$ echo "s/$/\\\/g"
s/$/\\/g
$ echo "s/$/\\b/g"
s/$/\b/g
$ echo "s/$/\\\b/g"
s/$/\\b/g
$ echo "s/$/\\\$/g"
s/$/\$/g

A czemu trzeba tak dużo backslashów? Bo, żeby uzyskać dwa przy parsowaniu sedem, musisz mu dać ich 4 - a żaby bash tyle przekazał, musisz mu podać ich teoretycznie 8, ale jeśli ostatni nie escapuje niczego, to można go umieścić bez escapowania.

0

To oczywiście kwestia basha, nie seda -- cudzysłowy pojedyńcze działają inaczej niż podwójne...

1 użytkowników online, w tym zalogowanych: 0, gości: 1