Usuń ukośniki odwrotne z pliku tekstowego


10

mam

Wejście:

 NISHA =\455  

Wynik:

 NISHA = 455

Chcę usunąć \z danych wyjściowych. Próbowałem użyć polecenia, sed "s/[\]//g" Pale nie działa i oznacza błąd:

character found after backslash is not meaningful

3
Wygląda na to, że masz implementację inną niż POSIX sed(a może uruchamiasz to polecenie z powłoki innej niż POSIX?). Nie trzeba sedjednak trwystarczy: tr -d '\\' < P.
Stéphane Chazelas

Odpowiedzi:


20

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'

Znaki specjalne

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.

  1. W regex (wejście do poleceń takich jak sed, grepetc.) 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.

  2. 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 sednie 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'



3

Jeśli nie chcesz rozwiązań sed, spróbuj wykonać następujące polecenia:

$ echo "NISHA =\455"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =\455"| tr '\\' ' '
$ echo "NISHA =\455"| tr -d '\\'
$ echo "NISHA =\455"| cut -c 1-7,9-11

2

W awk, chciałbym to zrobić,

$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455

1
sed 's/\\//'

Umieść \wcześniej, \jak to robisz z większością postaci specjalnych.


Pominąłeś gflagę 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.
pabouk
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.