Odpowiedzi:
Można zastąpić ukośnik odwrotny spacją, jak pokazano w przykładowym wyniku:
sed 's/\\/ /g'
lub możesz go usunąć, jak pokazano w kodzie:
sed 's/\\//g'
Możliwe są problemy z ucieczką odwrotnego ukośnika, aby anulować jego specjalne znaczenie. Odwrotny ukośnik to specjalny znak używany do ucieczki zarówno w powłoce, jak i wyrażeniach regularnych.
Polecenie, które wpisujesz do wiersza poleceń powłoki lub skryptu, jest najpierw przetwarzane przez powłokę, która interpretuje specjalne znaczenie znaków i ich ucieczkę. Wynik jest następnie przekazywany do polecenia, które ma zostać wykonane (jak sed
), które wykonuje własną interpretację znaków. Podczas konstruowania polecenia procedura mentalna jest odwrotna: najpierw dodaj znak ucieczki dla wyrażenia regularnego, a następnie dodaj znak ucieczki dla powłoki.
W regex (wejście do poleceń takich jak sed
, grep
etc.) backslash można uciec przez backslashem tak: \\
a także można wykorzystać zestaw wyrażenia [\]
jak dawniej, ponieważ nie backslash traci swoje specjalne znaczenie.
W powłoce (jak bash
) możesz uciec od ukośnika odwrotnego. Więc zamiast \
pisać \\
. Umieszczenie ciągu między podwójnymi cudzysłowami "
powoduje, że zachowanie odwrotnego ukośnika jest bardziej skomplikowane <1>, ale podwójny odwrotny ukośnik nadal powoduje powstanie pojedynczego odwrotnego ukośnika. Umieszczenie ciągu między pojedynczymi cudzysłowami '
powoduje, że każdy znak należy traktować dosłownie, z wyjątkiem '
.
Jeśli chcesz użyć podwójnych cudzysłowów , możesz użyć jednego z następujących poleceń :
sed "s/\\\\//g"
- Ucieczka \
przez \
powłokę i ucieczka każdego \
wyrażenia regularnego ponownie. W rzeczywistości podwójne cudzysłowy nie są w tym przypadku konieczne, ponieważ każdy znak specjalny jest odpowiednio usuwany.
sed "s/[\\]//g"
- Ucieczka w skorupie ukośnikiem odwrotnym \
i w wyrażeniu regularnym użyj zestawu [
]
.
sed "s/[\]//g"
- Tak, twój przykład powinien działać w środowisku zgodnym z POSIX! Między podwójnymi cudzysłowami \
reprezentuje siebie, chyba że poprzedza znak specjalny w kontekście podwójnych cudzysłowów: $`"\
lub nowego wiersza. Wygląda na to, że w twoim przypadku albo powłoka albo sed
nie jest zgodna ze standardem POSIX.
W przypadku pojedynczych cudzysłowów możesz również użyć łańcucha w taki sam sposób, w jaki go użyłeś lub w skrócie:
sed 's/[\]//g'
sed 's/\\//g'
W awk, chciałbym to zrobić,
$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455
sed 's/\\//'
Umieść \
wcześniej, \
jak to robisz z większością postaci specjalnych.
g
flagę z nieznanego powodu. Zmienia to zachowanie polecenia, ale taka zmiana nie była wymagana w pytaniu. W przeciwnym razie twoja odpowiedź nie przyniesie nic nowego w porównaniu do wcześniejszych odpowiedzi.
sed
(a może uruchamiasz to polecenie z powłoki innej niż POSIX?). Nie trzebased
jednaktr
wystarczy:tr -d '\\' < P
.