Shell: trova e sostituisce la parola


2

Ho una stringa nel mio script di shell, che è in un formato fisso: '[STATUS REPORT] PROJECT'. Quando l'utente esegue il mio script di shell, gli verrà chiesto di fornire un valore per 'PROJECT'.

Vorrei sostituire la parola 'PROJECT'con l'utente fornire valore. Ad esempio, se l' 'ABCD'utente ha inserito l'input:

"[RAPPORTO DI STATO] ABCD"

Ho due problemi: 1: Come affrontare personaggi speciali come "&" nel nome di un progetto? Ad esempio:

echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, "A&A"); print }' 

e ottengo il seguente output:

[RAPPORTO DI STATO] APROJECTA

2: La mia attuale istruzione shell è simile alla seguente:

echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, $ProjectName); print }'

dove $ ProjectName memorizza il nome del progetto fornito dall'utente. Ma questo non sembra funzionare

Come posso farlo funzionare correttamente?

Risposte:


5

Questo risolverà il tuo primo problema:

echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, "A\\&A"); print }'

( &è un carattere speciale nella sostituzione di awk: significa "ciò che è stato abbinato". Devi scappare se con a \. E poiché sei in una stringa di awk, devi mettere 2 \per produrne uno come \sfuggire al carattere successivo come in \n.)

Questo risolverà il tuo secondo problema:

ProjectName=toto
echo "[STATUS REPORT] PROJECT" |  awk -v "ProjectName=$ProjectName" '{ gsub(/PROJECT/, ProjectName); print }'

( Modifica : nota il nuovo aggiunto "in ProjectName=$ProjectNamemodo che uno spazio ProjectNamenon rompa lo script.)

Ma awk è un grande strumento per eseguire la sostituzione di stringhe, potresti voler usare sed:

echo "[STATUS REPORT] PROJECT" |  sed -e 's/PROJECT/A\&A/'
ProjectName=toto;
echo "[STATUS REPORT] PROJECT" |  sed -e "s/PROJECT/${ProjectName//\//\\/}/"

( Edit : una /in ProjectName. Volontà stava rompendo la soluzione iniziale ho aggiunto la fuga di tagli, ma qualche altro char (s) si rompe ancora: &, \1., ... penso shell bash pianura muggito è più sicuro)

o in semplice bash shell:

msg="[STATUS REPORT] PROJECT"
echo ${msg//PROJECT/A&A}
ProjectName=toto
echo ${msg//PROJECT/$ProjectName}

1
Per essere pedanti, questo non è vero: " &è un carattere speciale nelle espressioni regolari" - &è speciale nella stringa di sostituzione dei comandi sube gsub.
Glenn Jackman,

@glenn: true, ho aggiornato la risposta.
jfg956,

3

(Mi dispiace, non ho i privilegi di commento qui)

Dallo snippet che hai pubblicato non è molto chiaro il motivo per cui devi reindirizzare la stringa awk.

Puoi semplicemente usare la variabile all'interno echodell'istruzione e bash sostituirà la variabile:

echo "[STATUS REPORT] $ProjectName"

Questo script di shell fa parte di un'app GUI. La riga "PROGETTO [RAPPORTO STATO]" sarà una preferenza dell'utente. Un utente può impostare questa linea su "PROGETTO [RAPPORTO DI STATO]" come sua preferenza. Non voglio codificare questo. Quindi sto cercando di sostituire questo a livello di
codice

Ok capisco. Sembra che la awksoluzione basata su jfgagne potrebbe funzionare meglio per te. Poiché ProjectNameviene dichiarato come awkvariabile, non dovresti avere problemi con caratteri speciali.
Nithin Philips,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.