Zamień ciąg na inny skrypt powłoki


0

Mam plik w formacie:

"data","data","data",data".

Teraz, jeśli dane mają "w sobie, mój analizator składni nie może przeanalizować pliku. Więc chcę użyć sed do zastąpienia "z """ale nie tam, gdzie widzi ","jak to jest w zasadzie ogranicznik.

Nie mogę zrozumieć, jakie powinny być parametry sed.


Co jeśli dane zawierają ","?
choroba

@choroba nic nie mogę zrobić w tej sprawie. To nie jest zwykły język, ale CFG (myślę, że mam tam poprawną terminologię)
Cheetah,

Dlaczego nie trzy kroki: najpierw zmień „,” na coś takiego jak ~. Następnie zmień „na” „”. Następnie zmień ~ z powrotem na „,”. (w razie potrzeby użyj zamiast ~ czegoś, co nie pojawi się w twoich danych)
yosh m

Odpowiedzi:


2

Jestem pewien, że możesz to zrobić, sedale w Perlu jest mi znacznie łatwiej:

perl -pe 's/([^,])\"/$1xxx/g; s/xxx,/\",/g; s/xxx/\"\"\"/g' data.txt

WYJAŚNIENIE:

  • perl -pe : wykonaj skrypt podany w wierszu polecenia w każdym wierszu pliku wejściowego
  • s/([^,])\"/$1xxx/g;: zastępuj każde wystąpienie "poprzedzone dowolnym znakiem przecinkowym losowym ciągiem xxx. Zakłada się, że Twoje dane nigdy nie będą zawierać xxx.
  • s/xxx,/\",/g;: zastąp te xxx, po których następuje przecinek z powrotem do ",.
  • s/xxx/\\\"/g: zastąp resztę xxxcudzysłowami \", będą to te, "które były w Twoich danych.

PRZYKŁAD:

$ cat test.txt
"data","da"t"a","data","data","foo "bar" foo", "data"

$ perl -pe 's/([^,])\"/$1xxx/g; s/xxx,/\",/g; s/xxx//g' test.txt 
"data","data","data","data","foo bar foo","data

Nie chcę ich usuwać, po prostu uciec!
Gepard

@Ben, OK, zmodyfikowałem odpowiedź, aby uciec zamiast usuwać.
terdon

dzięki, właściwie dostałem obraz z doskonałego wyjaśnienia, które dałeś ... po prostu nie chciałem zaakceptować odpowiedzi, dopóki nie odpowiedział na pytanie ... Nienawidzę wybierać, ale ucieczka jest podwójnym podwójnym cytatem, a nie odwrotny ukos zgodnie z op
Gepard

Nie dręczysz @Ben, powinienem nauczyć się czytać pytania. Dzięki za wskazanie, powinno już działać.
terdon
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.