
Minha necessidade é acrescentar uma nova string após a primeira />
para todos os arquivos em um diretório.
Aqui está meu roteiro:
#!/bin/bash
find ./ -type f -print0 | while IFS= read -r -d '' myfile; do
sed -i '0,/\/>/asome text here' $myfile
done
No entanto, parece que todos \n
também combinam. Por exemplo, se um arquivo for assim:
abc
def
<abc/>
<abc/>
Depois de executar meu script, obterei o resultado abaixo:
abc
some text here
def
some text here
<abc/>
some text here
<abc/>
Ele acrescenta a nova string para a primeira ocorrência de />
, mas também acrescenta a nova string para cada linha antes da primeira />
.
Responder1
Sim. A expressão 0,/regex/
fará com que o comando seguinte ( a
) seja aplicado atodas as linhasaté (e incluindo) a primeira correspondência da expressão regular.
Meu palpite é que você gostaria de fazer
sed -i '0,/regex/{//a text
}' "$myfile"
Isso selecionará todas as linhas até a primeira correspondência da expressão regular e, em seguida, aplicará o comando apenas na linha dentro do intervalo que corresponde à expressão, enquanto passa todas as outras linhas inalteradas.
A nova linha literal é necessária para sinalizar o final do texto que você adiciona.