string - sed linux




Substituir toda a linha contendo uma string usando Sed (8)

É tão semelhante ao anterior ..

sed 's/[A-Za-z0-9]*TEXT_TO_BE_REPLACED.[A-Za-z0-9]*/This line is removed by the admin./'

Eu tenho um arquivo de texto que tem uma linha em particular algo como

sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext

Eu preciso substituir toda a linha acima com

This line is removed by the admin.

A palavra-chave de pesquisa é TEXT_TO_BE_REPLACED

Eu preciso escrever um script de shell para isso. Como posso conseguir isso usando sed ?


A resposta aceita não funcionou para mim por vários motivos:

  • minha versão do sed não gosta de -i com extensão de comprimento zero
  • a sintaxe do comando c\ é estranha e eu não consegui fazê-lo funcionar
  • Eu não percebi que alguns dos meus problemas estão vindo de cortes sem escape

Então, aqui está a solução que eu acho que deveria funcionar na maioria dos casos:

function escape_slashes {
    sed 's/\//\\\//g' 
}

function change_line {
    local OLD_LINE_PATTERN=$1; shift
    local NEW_LINE=$1; shift
    local FILE=$1

    local NEW=$(echo "${NEW_LINE}" | escape_slashes)
    sed -i .bak '/'"${OLD_LINE_PATTERN}"'/s/.*/'"${NEW}"'/' "${FILE}"
    mv "${FILE}.bak" /tmp/
}

Então, o uso da amostra para corrigir o problema colocado:

change_line "TEXT_TO_BE_REPLACED" "This line is removed by the admin." yourFile

Eu costumo usar regex para extrair dados de arquivos que eu usei apenas para substituir a citação literal \" com // nada :-)

cat file.csv | egrep '^\"([0-9]{1,3}\.[0-9]{1,3}\.)' | sed  s/\"//g  | cut -d, -f1 > list.txt

No meu makefile eu uso isso:

@sed -i '/.*Revision:.*/c\'"`svn info -R main.cpp | awk '/^Rev/'`"'' README.md

PS: NÃO se esqueça que o -i muda realmente o texto no arquivo ... então, se o padrão que você definiu como "Revisão" for alterado, você também mudará o padrão a ser substituído.

Exemplo de saída:

Abc-Project escrito por John Doe

Revisão: 1190

Então, se você definir o padrão "Revisão: 1190", obviamente, não é o mesmo que você definiu como "Revisão:" apenas ...


Você pode usar o comando change para substituir a linha inteira e o sinalizador -i para fazer as alterações no local. Por exemplo, usando o GNU sed:

sed -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo

Você precisa usar wildards ( .* ) Antes e depois para substituir a linha inteira:

sed 's/.*TEXT_TO_BE_REPLACED.*/This line is removed by the admin./'

bash-4.1$ new_db_host="DB_HOSTNAME=good replaced with 122.334.567.90"
bash-4.1$ 
bash-4.1$ sed -i "/DB_HOST/c $new_db_host" test4sed
vim test4sed
'
'
'
DB_HOSTNAME=good replaced with 122.334.567.90
'

Funciona bem


cat find_replace | while read pattern replacement ; do
sed -i "/${pattern}/c ${replacement}" file    
done 

O arquivo find_replace contém 2 colunas, c1 com padrão para correspondência, c2 com substituição, o laço sed substitui cada linha que contém um dos padrões da variável 1





sed