Mam plik zawierający wiele wierszy xml. Chciałbym zastąpić niektóre części pliku. Niektóre części pliku zawierają znaki cudzysłowu ( "
), które chciałbym zastąpić. Próbowałem uciec od znaku cudzysłowu \
, ale nie sądzę, że działa to na podstawie wyniku mojego pliku.
Oto przykład jednego z moich poleceń sed:
sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp
Czy w ten sposób unikasz cudzysłowów w poleceniu sed, czy robię coś złego?
"text"
ze'text'
. Oczywiście nic to nie da"othertext"
. Pokaż kilka wierszy wejściowych, odpowiadające im niepożądane wyjście i wyjaśnij, jakiego wyjścia chcesz.\"
prawidłowy sposób na unikanie cudzysłowów w poleceniu sed?"
. Ale twoje polecenie powłoki używa podwójnego cudzysłowu i\"
jest tam poprawne.sed
Program widzis/"text"/'text'/ig
jako argument-e
.s/\"text\" /'text'/ig
Czy znajdzie tylko"text"
po spacji po nim?sed
jest to odpowiednie narzędzie do pracy, może potrzebujesz parsera XML.Odpowiedzi:
Dwie wskazówki:
Nie można uciec przed pojedynczym cytatem w ciągu cytowanym pojedynczymi cudzysłowami. Musisz zamknąć wycenę, dodać wycenę, a następnie ponownie otworzyć wycenę. To znaczy
'foo'\''bar'
:, który rozkłada się na:'foo'
zacytowanyfoo
\'
uciekł'
'bar'
zacytowanybar
poddający się
foo'bar
./
w sed. Uważam, że używanie/
i\
w tym samym wyrażeniu sed utrudnia przeczytać.Na przykład, aby usunąć cytaty z tego pliku:
Biorąc pod uwagę moje dwie powyższe wskazówki, możesz użyć polecenia, aby usunąć zarówno podwójne, jak i pojedyncze cudzysłowy:
W oparciu o moją pierwszą wskazówkę, powłoka redukuje drugi argument sed (tj. Ciąg po
-e
) dos|["']||g
i przekazuje ten ciąg do sed. Na podstawie mojej drugiej wskazówki sed traktuje to tak samo jaks/['"]//g
. To znaczyPrawdopodobnie potrzebujesz czegoś bardziej złożonego niż to, co chcesz, ale to dopiero początek.
źródło
'foo'\''bar'
moglibyśmy użyć'foo'"'"'bar'
.Mam port narzędzi uniksowych dla systemu Windows, więc polecenia wyglądają nieco inaczej, ale miałem plik csv z przecinkami i znakami cudzysłowu. Używając tego wątku jako przewodnika, mogłem usunąć cytaty za pomocą tego polecenia:
źródło