Como substituir uma linha inteira pelo sed?


132

Suponha que eu tenha um arquivo com linhas

aaa = bbb

Agora eu gostaria de substituí-los por:

aaa = xxx

Eu posso fazer isso da seguinte maneira:

sed "s / aaa = bbb / aaa = xxx / g"

Agora eu tenho um arquivo com algumas linhas da seguinte maneira:

aaa = bbb
aaa = ccc
aaa = ddd
aaa = [outra coisa]

Como posso substituir todas essas linhas aaa=[something]pelo aaa=xxxuso de sed ?


2
O [something else]texto é literal ou é apenas um espaço reservado? Qual é o formato possível da coisa após o sinal de igual?
555533

isso é mais uma questão de regex, não uma questão sed.
saferJo

Respostas:


217

Tente o seguinte:

sed "s/aaa=.*/aaa=xxx/g"

4
Força do hábito, pode ser ignorado neste caso - é usado como um substituto global para a linha substituir cada partida, e não apenas a primeira. Nesse caso, embora apenas o primeiro seja correspondido por causa do .*.
John Doyle

1
Michael J. Barber, gsubstitua toda a instância do regexp pela substituição
A-IV

116

Você também pode usar a linha de alteração do sed para fazer isso:

sed -i "/aaa=/c\aaa=xxx" your_file_here

Isso examinará e encontrará as linhas que passam no aaa=teste, o que significa que a linha contém as letras aaa=. Em seguida, substitui a linha inteira por aaa = xxx. Você pode adicionar um ^no início do teste para garantir que você só obtenha as linhas que começam, aaa=mas isso é com você.


12
O OS X sedprecisa cser seguido por uma barra invertida e uma nova linha, e não anexa uma nova linha ao texto inserido, mas você pode usar, por exemplo $'/aaa=/c\\\naaa=xxx\n'.
Lri

Aqui está um exemplo na documentação sed do recurso de alteração / substituição que o @Mr. T está falando.
gene_wood

Este é o mais próximo de realmente fazer o que foi pedido ... (Mas a versão de Lri é necessário para portabilidade)
Gert van den Berg

42

Como isso:

sed 's/aaa=.*/aaa=xxx/'

Se você deseja garantir que aaa=está no início da linha, faça-o:

sed 's/^aaa=.*/aaa=xxx/'

1
E se eu quiser substituir por aaa = 'xxxx'. Tentei escapar como sed 's/aaa=.*/aaa=\'xxx\'/', mas que abre um >prompt de uma nova linha de ...
Nagev

2

Se você gostaria de usar awk, isso também funcionaria

awk -F= '{$2="xxx";print}' OFS="\=" filename

2
sed -i.bak 's/\(aaa=\).*/\1"xxx"/g' your_file

0

Isso pode funcionar para você:

cat <<! | sed '/aaa=\(bbb\|ccc\|ddd\)/!s/\(aaa=\).*/\1xxx/'
> aaa=bbb
> aaa=ccc
> aaa=ddd
> aaa=[something else]
!
aaa=bbb
aaa=ccc
aaa=ddd
aaa=xxx

Eu não acho que uma verificação explícita para bbb, ccce dddé exatamente o que o OP tinha em mente.
spinup
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.