pt - altere as linhas que começam com uma palavra dada e terminam com outra?

0

Por exemplo, dado:

$ cat test001.txt
this
is a
 test bucket
bucket line not this one.
  bucket lein endy
    bucket and others endy
and
a ttest

Como posso alterar as linhas que começam com "bucket" com "(bucket", ignorando espaços?

Até agora eu tenho:

sed -i 's/^\sbucket/bucket(/g' test001.txt    

mas isso não funciona (sem alteração e sem erro). Então eu gostaria de fazer isso apenas para linhas que também terminam com 'endy' (então apenas 2 das 3 linhas de bucket).

    
por Michael Durrant 24.10.2013 / 05:01

3 respostas

3

Aqui está outra abordagem:

sed -e '/^[[:space:]]*bucket.*endy$/s/bucket/(bucket/' file.txt

O /pattern/ inicial diz ao sed para trabalhar apenas em linhas contendo esse pattern , e o resto é uma substituição simples e padrão.

    
por 24.10.2013 / 12:04
4

Você pode usar referências anteriores (por exemplo, ) no seu termo substituto, que substituirá as subexpressões (itens entre parênteses com escape - \(…\) ) em seu termo de pesquisa. Por exemplo,

$ cat test001.txt | sed -e 's/^\([[:space:]]*\)\(bucket.*endy\)$/(/'
this
is a
 test bucket
bucket line not this one.
  (bucket lein endy
    (bucket and others endy
and
a ttest

criará duas subexpressões:

  1. os espaços iniciais: ^\([[:space:]]*\)
  2. a string que começa com "bucket" e termina com "endy" (na EOL): \(bucket.*endy\)$

Em seguida, ele substituirá qualquer linha que corresponda a ( , que é o espaço em branco, seguido por um parêntese de abertura, seguido pela string bucket..endy.

    
por 24.10.2013 / 09:43
1

O \s não faz parte do BRE, que sed usa. Em BRE \s é o mesmo que um literal s . O equivalente a \s seria [[:space:]] . Tente o seguinte:

sed -i 's/^[[:space:]]*bucket/(bucket/g' test001.txt
    
por 24.10.2013 / 05:12

Tags