Como dividir a expressão sed longa em várias linhas?

12
sed 's/[long1][long2]/[long3][long4]/' file.txt

Eu gostaria de dividir este comando em várias linhas - f.x. algo assim:

sed 's/
    [long1]
    [long2]
  /
    [long3]
    [long4]
  /' file.txt

Usar \ ou separar strings não funcionou.

    
por Raffael 28.07.2014 / 12:06

4 respostas

8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

A divisão em várias linhas com contrabarra funciona se novas linhas não forem recuadas.

$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/-/'
b-a

Testado no Cygwin com o GNU sed 4.2.2

    
por 28.07.2014 / 12:56
7

Você pode salvar uma string longa em variáveis bash e usar no comando sed :

string=[long1][long2]
replace= [long3][long4]
sed -e 's/'"$string"'/'"$replace"'/' file

Se você puder usar perl , poderá quebrar o padrão longo com o modificador x :

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file
    
por 28.07.2014 / 12:36
6

Outro aspecto:

Qual é a manutenção dos itens [long] acima?

Quanto mais curto e mais distinto você puder manter as cláusulas, mais fáceis elas serão de mudar e melhorar à medida que o tempo passa e os fatos (sed-externos) mudarem em torno da função que eles fornecem.

por exemplo,

sed \
-e 's/[minimal-s1]/[minimal-r1]/' \
-e 's/[minimal-s2]/[minimal-r2]/' \
-e 's/[minimal-s3]/[minimal-r3]/' \
-e 's/[minimal-s4]/[minimal-r4]/' 

... pode ser algo pelo que lutar e preferir.

    
por 28.07.2014 / 13:31
4

Você também pode dividir isso da seguinte maneira:

sed '/[long1][long2]/
    s//[long3][long4]/'

Ou talvez como:

sed "$(
    printf 's/[%s][%s]/[%s][%s]/' \
        long1 \
        long2 \
        long3 \
        long4
)"

Ou com um heredoc:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
    
por 28.07.2014 / 12:59

Tags