
Eu tenho um arquivo de texto semelhante ao exemplo abaixo.
eu quero inserir
<string>insert-me</string>
na linha indicada.
Como eu posso fazer isso? Tentei variações semelhantes a esta:
sed "/s/<key>first</key>/\n <array>/\n/test/g" test.txt
e continuo recebendo o erro "sinalizador incorreto no comando substituto".
Obrigado
arquivo de texto de exemplo:
<record>
<key>first</key>
<array>
--I want to insert the line here--
<string>hello</string>
<string>world</string>
</array>
</record>
<record>
<key>second</key>
<array>
<string>its</string>
<string>me</string>
<string>again</string>
<string>hello</string>
<string>world</string>
<string>again</string>
</array>
</record>
Responder1
Existem vários problemas aqui (além do problema geral de tentar analisar dados estruturados com ferramentas regex)
se o seu padrão (ou substituição) contiver barras, você precisará usar um separador diferente para os comandos sed ou escapar das barras
sed é (normalmente) orientado a linhas, portanto você não pode combinar os limites das linhas, a menos que você puxe linhas adicionais para o espaço do padrão com
N
combinar quantidades específicas de espaços em branco tornará tudo ainda mais frágil
Então, por exemplo, você poderia fazer:
sed '/<key>second<\/key>/ {N; s/\n[[:blank:]]*<array>/&\n\tinsert-me/;}' test.txt
ou (mais naturalmente) usandoagastar em vez deésubstituto
sed -e '/<key>second<\/key>/ {N; /<array>/ a\\tinsert-me' -e ';}' test.txt
<record>
<key>first</key>
<array>
--I want to insert the line here--
<string>hello</string>
<string>world</string>
</array>
</record>
<record>
<key>second</key>
<array>
insert-me
<string>its</string>
<string>me</string>
<string>again</string>
<string>hello</string>
<string>world</string>
<string>again</string>
</array>
</record>