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.

Gepard
źródło
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
terdon
źródło
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