Você está simplesmente procurando por isso?
sed -i '\%/\([^/:]*\):Tag=%n;s%%/\(\([^/:]*\):Tag=\)[^/:-]*-[^/:-]*%%' *.j1
(Tente sem o -i
para ver a saída sem gravar de volta no arquivo original - canalize para less
para que você possa pausar e rolar para frente e para trás.)
Os parênteses na primeira expressão procuram uma string entre uma barra e dois pontos; se acharmos isso imediatamente seguido por Tag=
e a mesma string que combinou entre parênteses, estamos bem. Os parênteses invertidos capturam essa string para que possamos nos referir a ela como .
Se não encontrarmos esse padrão, a string após Tag=
deverá ser diferente da string capturada; se assim for, substitua a string após Tag=
com a string capturada. A expressão regular substitui uma sequência que contém um único traço e, de outro modo, nenhum traço, ponto e vírgula ou barra (portanto, até pouco antes do segundo traço ou da primeira barra ou dois-pontos).
Se você estiver em * BSD (incluindo o Mac OS), precisará de -i ''
em vez de apenas -i
.
Para outra abordagem, você pode refatorar seus mapeamentos para um script sed
. Se você tiver um arquivo incorrect_tags.txt
like
"BA-02-1" "BA-03"
"BA-02-2" "BA-04"
então você pode executar o seguinte script
sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt
que produz ... outro script sed
que agora parece
s/BA-02-1/BA-03/g
s/BA-02-2/BA-04/g
que você pode passar para outra instância de sed
para modificar os arquivos que contêm esses tokens que você deseja substituir.
O pipeline completo é então
sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt |
sed -i -f - *.j1
e, novamente, você pode querer tentar sem -i
primeiro para ver como é a saída. Além disso, seu sed
pode não gostar da opção -f
ou pode não suportar a leitura de um script na entrada padrão; talvez então simplesmente salve a saída da primeira invocação de sed
para um arquivo temporário e então dê o nome do arquivo temporário como o argumento do nome do arquivo para -f
.
Observe que isso exigirá que as tags não sejam sobrepostas - se você substituir A por B e B por C, o resultado final será como se você tivesse especificado "A" "C". Uma solução alternativa é trocar a ordem de modo que B seja substituído por C primeiro, e somente então A com B.