Começando com esta entrada:
$ cat file1
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Posso colocar o primeiro conjunto de números entre parênteses:
$ sed -En 's/[0-9]*:/(&)/ p'
Bus 001 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
Mas se eu também tentar preceder a linha com & (a string correspondente), não recebo nada:
$ sed -En 's/[0-9]*:/(&)/ ; s/^/(&)/ p' infile
()Bus 001 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
()Bus 002 Device (001:) ID 1d6b:0002 Linux Foundation 2.0 root hub
Como posso fazer isso?
O
&
na parte de substituição dos
comando é um espaço reservado para qualquer expressão regular correspondente no mesmos
comando .Sua segunda substituição é
s/^/(&)/
e, como corresponderia à string vazia no início de qualquer linha, inseriria a string literal()
no início de cada linha. O parêntese estaria vazio, pois&
é substituído por uma string vazia.Se você quiser corresponder a primeira substring de dígitos (com um final
:
), colocá-los entre parênteses e também anexar o parêntese com os dígitos ao início da linha, então você terá que deixar os
comando modificar a parte relevante de a linha de uma só vez, possivelmente assim:Aqui, certifiquei-me de combinar e coletar a peça antes do número do dispositivo, bem como o número e os dois pontos em dois grupos de captura. Posso então acrescentar e preceder o segundo grupo (entre parênteses) ao primeiro grupo no texto de substituição.
Estou combinando a parte inicial da linha com
.*Device
porque se eu tivesse usado apenas.*
, ele também teria engolido os dígitos anteriores a:
, e o segundo grupo conteria apenas dois pontos.Alternativamente, com duas substituições onde a primeira substituição coloca o número e dois pontos entre parênteses e a segunda corresponde ao parêntese e o acrescenta à linha:
Resumindo: o
s
comando só pode modificar a parte da string que corresponde à expressão regular, e o&
espaço reservado é substituído pelo texto que corresponde à expressão regular nos
comando atual. Se você precisar duplicar e/ou modificar algo no meio do texto e movê-lo para o início da linha, então você terá que combinar todas essas partes da string, possivelmente capturando-as em grupos de captura.