sed com caractere de escape automático [duplicado]

0
CommentAppend() {
    # Comment line and append line below commented line 
    local comment="$1"      # search this line and comment it 
    local append="$2"       # Append this line below commented line 
    local InputFile="$3"    

    sed -i "s/${comment}/#${comment}/g ; s/#${comment}/& \n${append}/" $InputFile
}

Esta função funciona bem para caracteres que não são de escape, mas quando o caractere de escape está disponível, ele falha.

Então, podemos construir função, para caráter de escape?

    
por Rahul Patil 25.08.2013 / 15:57

2 respostas

1

Você pode fazer assim:

CommentAppend() {
    # Comment line and append line below commented line 
    local comment="$1"      # search this line and comment it 
    local append="$2"       # Append this line below commented line 
    local InputFile="$3"    

    perl -pi -e "s/\Q${comment}\E/#${comment}\n${append}/g" "$InputFile"
}

Os delimitadores \Q...\E em expressões regulares Perl garantem que qualquer coisa entre eles seja interpretada como uma string literal em vez de uma expressão regular (consulte perldoc perlre ).

Observe que a substituição pode ser executada em apenas uma etapa e o nome do arquivo deve ser citado (como em "$InputFile" ) para evitar a divisão de palavras. Isso se aplica se você usa sed ou perl .

    
por 25.08.2013 / 17:38
0

Eu verifiquei o sed com -E agrs mas não funcionou, então usei as seguintes alterações, parece estar funcionando ..

CommentAppend() {
        # Comment line and append line below commented line
        local comment="$( echo "$1" | sed 's/\(\/\)/\\//g' )"  # search this line and comment it
        local append="$( echo "$2" | sed 's/\(\/\)/\\//g' )"   # Append this line below commented line
        local InputFile="$3"


        sed -i "s/${comment}/#${comment}/g ; s/#${comment}/& \n${append}/" $InputFile
}

Teste

root@router:~# bash -x /tmp/test.sh
+ CommentAppend 'connection = sqlite:////var/lib/keystone/keystone.db' 'connection = mysql://keystoneUser:[email protected]/keystone' /tmp/test.conf
++ sed 's/\(\/\)/\\//g'
++ echo 'connection = sqlite:////var/lib/keystone/keystone.db'
+ local 'comment=connection = sqlite:\/\/\/\/var\/lib\/keystone\/keystone.db'
++ sed 's/\(\/\)/\\//g'
++ echo 'connection = mysql://keystoneUser:[email protected]/keystone'
+ local 'append=connection = mysql:\/\/keystoneUser:[email protected]\/keystone'
+ local InputFile=/tmp/test.conf
+ sed -i 's/connection = sqlite:\/\/\/\/var\/lib\/keystone\/keystone.db/#connection = sqlite:\/\/\/\/var\/lib\/keystone\/keystone.db/g ; s/#connection = sqlite:\/\/\/\/var\/lib\/keystone\/keystone.db/& \nconnection = mysql:\/\/keystoneUser:[email protected]\/keystone/' /tmp/test.conf
    
por 25.08.2013 / 15:57