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

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

Gostaria de dividir este comando em várias linhas - fx algo como isto:

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

Usar \ou separar cadeias não funcionou.

Raffael
fonte
É por isso que o Perl tem o /xmodificador para substituição.
choroba 28/07
1
@ Networker: sim, obrigado, eu adicionei minha resposta lá também
Raffael

Respostas:

8

Você pode salvar uma string longa no bash de variáveis ​​e usar no sedcomando:

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

Se você pode usar perl, pode quebrar um padrão longo com o xmodificador:

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file
cuonglm
fonte
1
Por que você usa tantas citações? sed "s/$string/$replace/" file.txtestá bem.
Scott
1
Além disso, é claro, você precisa excluir o espaço depois replace=.
Scott
8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

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

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

Testado em Cygwin com GNU sed 4.2.2

Raffael
fonte
Qual é a sua versão sed? Eu testei com GNU sed version 4.2.1e não funciona.
cuonglm
2
Parece que falta uma barra invertida no final da primeira linha, após a barra?
Volker Siegel
6

Outro aspecto:

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

Quanto mais curtas e distintas você puder manter as cláusulas, mais fácil elas serão alteradas e aprimoradas à medida que o tempo passa e os fatos (externos externos) mudam em torno da função que elas fornecem.

por exemplo

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

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

Hannu
fonte
4

Você também pode dividir dessa 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
mikeserv
fonte