Poniżej znajduje się fragment skryptu powłoki z większego skryptu. Usuwa cudzysłowy z łańcucha przechowywanego przez zmienną. Robię to za pomocą sed, ale czy jest wydajne? Jeśli nie, to jaki jest skuteczny sposób?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt"
. Ta składnia usunie qoutes tylko wtedy, gdy istnieje pasująca para.Odpowiedzi:
Jest prostszy i bardziej wydajny sposób, używając funkcji usuwania prefiksu / sufiksu natywnej powłoki:
${opt%\"}
usunie sufiks"
(znak ucieczki z ukośnikiem odwrotnym, aby zapobiec interpretacji powłoki).${temp#\"}
usunie prefiks"
(znak ucieczki z ukośnikiem odwrotnym, aby zapobiec interpretacji powłoki).Kolejną zaletą jest to, że usunie otaczające cytaty tylko wtedy, gdy istnieją otaczające cytaty.
BTW, twoje rozwiązanie zawsze usuwa pierwszy i ostatni znak, bez względu na to, jakie mogą być (oczywiście, jestem pewien, że znasz swoje dane, ale zawsze lepiej być pewnym, co usuwasz).
Za pomocą sed:
(Poprawiona wersja, jak wskazuje jfgagne, pozbycie się echa)
Zastępuje zatem prowadzenie
"
bez niczego, a ciągnięcie"
z niczym. W tej samej inwokacji (nie trzeba instalować potoków i uruchamiać kolejnej wersji. Za pomocą-e
można przetwarzać wiele tekstów).źródło
sed -e 's/^"//' -e 's/"$//' <<< $opt
.sed
wyrażenia regularnego lub podstawienie zmiennej może być zawinięte w coś w wierszucase $opt in '"'*'"') ... do it ... ;; esac
sed 's/^"\|"$//g'
Użyj tr, aby usunąć
"
:Uwaga : Usuwa to wszystkie podwójne cudzysłowy, nie tylko początkowe i końcowe.
źródło
Spowoduje to usunięcie wszystkich podwójnych cudzysłowów.
źródło
Don't remove this \" quote
.:-(
Istnieje prosty sposób użycia xargs :
xargs używa echa jako polecenia domyślnego, jeśli nie podano polecenia, i usuwa cudzysłowy z wejścia. Zobacz np . Tutaj .
źródło
echo '"quoted"' | xargs
->quoted
Możesz to zrobić za pomocą tylko jednego połączenia, aby
sed
:źródło
Najkrótsza droga - spróbuj:
W rzeczywistości usuwa wszystkie
"
s (podwójne cudzysłowy) zopt
(czy naprawdę będzie więcej podwójnych cudzysłowów innych niż na początku i na końcu? Więc to w rzeczywistości to samo i znacznie krótsze ;-))źródło
Jeśli używasz jq i próbujesz usunąć cytaty z wyniku, inne odpowiedzi będą działać, ale jest lepszy sposób. Korzystając z
-r
opcji, możesz wydrukować wynik bez cudzysłowów.źródło
jq
ale pamiętaj, że to nie działa, jeśli jq wypisuje również wyjście ASCII za pomocą-a
(jest to błąd po stronie jq)yq
ma również-r
opcję:yq -r '.foo' file.yml
Aktualizacja
Prosta i elegancka odpowiedź z usuwania pojedynczych i podwójnych cudzysłowów w ciągu za pomocą tylko poleceń bash / standardowych Linuksa :
BAR=$(eval echo $BAR)
wycina cytaty zBAR
.================================================== ===========
Na podstawie odpowiedzi hueybois wymyśliłem tę funkcję po wielu próbach i błędach:
Jeśli nie chcesz niczego drukować, możesz przesłać ewaluacje
/dev/null 2>&1
.Stosowanie:
źródło
Najłatwiejsze rozwiązanie w Bash:
Nazywa się to rozszerzaniem podciągów (zobacz Podręcznik Gnu Bash i wyszukaj
${parameter:offset:length}
). W tym przykładzie bierze podłańcuch ods
początku w pozycji 1 i kończąc na drugiej ostatniej pozycji. Wynika to z faktu, że jeślilength
jest wartością ujemną, jest interpretowana jako przesunięcie wstecz w stosunku do końcaparameter
.źródło
Jest to najbardziej dyskretny sposób bez użycia sed:
Lub
Wynik:
Mam to ze źródła .
źródło
Jest na to inny sposób. Lubić:
źródło
Moja wersja
Funkcja akceptuje nazwy zmiennych i usuwa cudzysłowy. Usuwa tylko pasującą parę wiodących i końcowych cytatów. Nie sprawdza, czy cytat końcowy jest zastępowany (poprzedzony przez
\
tym, że sam nie jest zastępowany).Z mojego doświadczenia wynika, że funkcje ogólnego zastosowania ciągów znaków, takie jak ta (mam ich bibliotekę), są najbardziej wydajne podczas bezpośredniego manipulowania ciągami, nie używając żadnego dopasowania wzorca, a zwłaszcza nie tworząc żadnych podpowłok lub wywołując jakiekolwiek narzędzia zewnętrzne, takie jak
sed
,awk
lubgrep
.źródło
Wiem, że to bardzo stare pytanie, ale tutaj jest kolejna odmiana sed, która może być przydatna dla kogoś. W przeciwieństwie do niektórych innych, zastępuje tylko podwójne cudzysłowy na początku lub na końcu ...
źródło