Shell: localizar e substituir palavra

2

Eu tenho uma string no meu shell script que está em um formato fixo: '[STATUS REPORT] PROJECT' . Quando o usuário executa meu script de shell, ele será solicitado a fornecer um valor para 'PROJECT' .

Eu gostaria de substituir a palavra 'PROJECT' pelo valor fornecido pelo usuário. Por exemplo, se 'ABCD' foi entrada do usuário:

'[STATUS REPORT] ABCD'

Eu tenho dois problemas: 1: Como lidar com caracteres especiais como '&' em um nome de projeto? Por exemplo:

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

e recebo a seguinte saída:

[STATUS REPORT] APROJECTA

2: Minha declaração de shell real é assim:

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

em que $ ProjectName armazena o nome do projeto fornecido pelo usuário. Mas isso não parece funcionar

Como posso fazer isso funcionar corretamente?

    
por smokinguns 10.08.2011 / 06:45

2 respostas

5

Isso resolverá seu primeiro problema:

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

( & é um caractere especial em substituição de awk: significa "o que foi correspondido". Você precisa escapar com \ . E como você está em uma string do awk, é necessário colocar 2 \ para produzir um como \ escape do próximo char como em \n .)

Isso resolverá seu segundo problema:

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

( Editar : observe o recém-adicionado " em torno de ProjectName=$ProjectName , para que um espaço em ProjectName não quebre o script.)

Mas o awk é uma grande ferramenta para realizar a substituição de strings, você pode querer usar o sed:

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

( Editar : um / em ProjectName will estava quebrando a solução inicial. Eu adicionei o escape de barras, mas outro (s) outro (s) caractere o quebra: & , , ... Eu acho que o shell abaixo é mais seguro.)

ou no shell bash simples:

msg="[STATUS REPORT] PROJECT"
echo ${msg//PROJECT/A&A}
ProjectName=toto
echo ${msg//PROJECT/$ProjectName}
    
por 10.08.2011 / 09:23
3

(Desculpe, não tenho privilégios de comentário aqui)

No snippet que você postou, não está muito claro por que você precisa canalizar a string para awk .

Você pode simplesmente usar a variável na instrução echo e o bash substituirá a variável:

echo "[STATUS REPORT] $ProjectName"
    
por 10.08.2011 / 06:55