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 `('
È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top