tenho o seguinte arquivo
> cat tmp
"aaa"
"aaa:xyz"
A saída desejada é
"bbb"
"aaa:xyz"
Estou usando o seguinte comando sed
sed "s/\baaa\b/bbb/" tmp
Mas com este comando, eu recebo
"bbb"
"bbb:xyz"
O caractere de dois pontos é considerado como limite de palavra. Como posso obter a saída desejada onde apenas a primeira linha é alterada e não a 2ª linha? Eu até tentei o seguinte, mas não teve efeito
sed "s/\Baaa\B/bbb/" tmp
sed "s/\baaa\B/bbb/" tmp
sed "s/\Baaa\b/bbb/" tmp
Edit: eu tenho que usar outros comandos sed no mesmo arquivo como este
's/aaa:xyz/ttt/' tmp
Então, não posso fazer substituição apenas se não houver dois pontos. Eu deveria ser capaz de fazer a substituição independentemente dos dois pontos estarem presentes na linha
Se não corresponder,
:
substitua aaa por bbb:Com perl:
Com sed:
Resultado:
O padrão de limite de palavra de largura zero GNU
\b
corresponde entre um caractere de palavra e um caractere que não é de palavra. Um "caractere de palavra" geralmente é qualquer caractere alfanumérico e sublinhado (_
). Isso significa que\b
corresponderia entreaaa
e:
na stringaaa:
.O seguinte ilustra onde
\b
as correspondências em seu documento de exemplo, substituindo todas as correspondências de\b
por*
:Para substituir todas as instâncias de
"aaa"
por"bbb"
, usePara substituir todas as palavras
aaa
porbbb
em qualquer linha que não contenha dois pontos:Para substituir todas as palavras
aaa
seguidas por algo que não seja dois pontos, porbbb
:Observe que a primeira substituição aqui requer que a
aaa
substring seja seguida por outro caractere. Isso significa que aaaa
substring não seria substituída na extremidade da linha. É por isso que fazemos uma substituição separada para esse caso.