Substitui um padrão contendo um apóstrofo em um arquivo

7

Eu tenho um arquivo de texto que contém esta linha:

set stime = '0 0'

Eu preciso mudar isso para:

set stime = '0 4'

Eu tentei estes comandos:

sed -i 's/original/new/g' file.txt

e

awk '{gsub(/pattern/,"replacement")}' file 

mas eles não funcionam. Eu acho que é por causa do apóstrofo no padrão. Como posso fazer isso corretamente?

    
por deepblue 01.03.2017 / 11:50

2 respostas

8

Para evitar cotação única ' , você deve usar aspas duplas: " .

Para atualizar no local, você deve usar sed -i

O código a seguir deve atualizar no local e escapar da aspa simples:

sed -i "s/set stime = '0 0'/set stime = '0 4'/g" input_file_name
    
por Yaron 01.03.2017 / 11:59
5

Você tem algumas escolhas:

  1. Use aspas duplas em vez de aspas simples para os comandos sed ou awk:

    sed -i "s/set stime = '0 0'/set stime = '0 4'/g" file
    

    ou

    awk "{gsub(/set stime = '0 0'/,\"set stime = '0 4'\")}1;" file 
    
  2. Salve o padrão em uma variável do shell e use aspas duplas:

    replacement="set stime = '0 4'"
    pattern="set stime = '0 0'"
    

    então

    sed "s/$pattern/$replacement/g" file
    

    ou

    awk -vpat="$pattern" -vrep="$replacement" '{gsub(pat,rep)}1;' file 
    
  3. Não use o padrão inteiro. Basta encontrar a linha certa e substituir apenas o que precisa ser alterado, evitando a cotação. Por exemplo, se você tiver apenas uma ocorrência de set stime , poderá fazer:

    sed '/set stime/{s/0 0/0 4/}' file 
    

    ou

    awk '=="set" && =="time"{sub("0 0","0 4")}1' file
    
por terdon 01.03.2017 / 12:04