Problema con il comando sostituire
Domanda
Ho qualche problema con il comando sostituire.
file di input ho questo
{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}
Voglio sostituire con apici
'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'
Con il comando di seguito citato
find input.txt -exec sed 's/{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}/'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'/g' {} \;
sto ottenendo errore come questo
bash: syntax error near unexpected token `('
Soluzione 4
Finalmente ho trovato modo semplice per farlo.
cat input.txt SED "s / {a [$ 1] = una FS $ 2 [$ 1]} END {for (i in a) stampare i, a [i]} / '{a [$ 1] = a [ $ 1] FS $ 2} END {for (i in a) stampare i, a [i]} '/ g "
Spero di utile
Altri suggerimenti
In primo luogo, non è possibile inserire facilmente un singolo citazione letterale in un argomento che è delimitato con virgolette singole.
È necessario sostituire il '
è con '"'"'
o '\''
.
Come un suggerimento per indovinare questo problema, qui, la denuncia arriva dal guscio, il che significa che anche la tua riga di comando è valido.
In secondo luogo, si deve essere consapevoli che dollaro e parentesi sono caratteri speciali nelle espressioni regolari sed. Si dovrà probabilmente per sfuggire loro. Leggi man sed
per maggiori dettagli su questo.
In terzo luogo, io non sono sicuro se find input.txt
funzionerà. Credo che si intende find . -type f -name input.txt
?
E 'perché il '
nudi nella stringa di sostituzione è effettivamente terminato il comando sed
, cioè la shell sta cercando di elaborare la linea. Questo in realtà è diventato subito evidente quando modifica di Benoit causato correttamente la tua domanda per la sintassi-colore. È possibile vedere il secondo '
sulla linea (il primo carattere del testo di sostituzione) cambiato il colore da rosso a causa nero per la terminazione della stringa.
Inoltre, sed
non sarà come l'uso di []
nudo poiché indicano le classi di caratteri nelle espressioni regolari.
È possibile risolvere entrambi i problemi con:
pax> find input.txt -exec sed 's/{a\[$1\]=a\[$1\]FS$2}END{for(i in a) print i,a\[i\]}/\x27{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}\x27/g' {} \;
quali uscite:
'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'
Quindi, in pratica, la fuga le parentesi quadre nella stringa di ricerca in modo che siano trattati come letterali e l'uso \x27
nella stringa di sostituzione al posto di '
.
Lo trovo divertente perché si dovrebbe avere a che fare questo. Si dovrebbe scrivere il codice corretto, in primo luogo, dal momento che posso vedere il suo codice awk. Non mi dire che volutamente omette l'apice singolo nel file input.txt
quando è stato creato? E il suo solo un singolo file che si sta modificando. Non c'è alcuna necessità di utilizzare find. (A meno che non si sa dove si trova).