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 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).
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:
^\([[:space:]]*\)
\(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.
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
Tags sed