2011-06-29 14 views
15

Mam linie z pojedynczym : i ' w nich, których chcę się pozbyć. Chcę użyć do tego celu awk. Próbowałem przy użyciu:Zastępowanie znaku `` char przy użyciu awk

awk '{gsub ("[:\\']","") ; print $0 }' 

i

awk '{gsub ("[:\']","") ; print $0 }' 

i

awk '{gsub ("[:']","") ; print $0 }' 

non z nich pracował, ale zwróci błąd Unmatched ".. kiedy kładę

awk '{gsub ("[:_]","") ; print $0 }' 

to działa i usuwa wszystkie : i _ znaki. Jak mogę pozbyć się znaku '?

Odpowiedz

6

Można użyć:

  1. kodzie ósemkowym dla pojedynczego cytat:

    [:\47] 
    
  2. Pojedynczy cytat wewnątrz podwójnych cudzysłowów, ale w tym przypadku specjalnych znaków zostanie rozszerzony przez powłokę :

    % print a\': | awk "sub(/[:']/, x)"   
    a 
    
  3. Użyj dynamicznego wyrażenia regularnego, ale istnieją implikacje wydajności związane tego podejścia:

    % print a\': | awk -vrx="[:\\\']" 'sub(rx, x)' 
    a 
    
11

tr jest wykonany do tego celu

echo test\'\'\'\':::string | tr -d \': 
teststring 

$ echo test\'\'\'\':::string | awk '{gsub(/[:\47]*/,"");print $0}' 
teststring 
8

to działa:

awk '{gsub("[:'\'']",""); print}' 
6

Z bash nie można wstawić pojedynczy cytat wewnątrz literału otoczony pojedynczymi cudzysłowami. Użyj na przykład '"'"'.

Pierwszy ' zamyka bieżącą dosłownym, a następnie "'" Łączy go z dosłownym zawierającym tylko pojedynczy cudzysłów, a ' ponownie otwiera ciąg dosłowne, który będzie również łączone.

Co chcesz to: alternatywa

awk '{gsub ("[:'"'"']","") ; print $0; }' 

ssapkota jest również dobre ('\'').

2

Nie wiem, dlaczego ograniczasz się do korzystania z awk, w każdym razie masz wiele odpowiedzi od innych użytkowników. Możesz również użyć sed, aby pozbyć się ":" "

To również będzie służyło Twojemu celowi. Prosty i mniej złożony.

2

Działa to również:

awk '{gsub("\x27",""); print}'

0

Najprostszym awk '{gsub(/\047|:/,"")};1'

Powiązane problemy