Atualização: Estendendo a idéia sed-to-sed de Arcege
, você pode ter um layout mais gerenciável (tabular ou irregular) para seus modelos de localização / replicação, que podem ser inline ... e não há necessidade para um arquivo intermediário: (adicione um g
antes do p'<<'EOF'
para fazer várias alterações por linha ... Observe que foo
, barbar
, etc serão tratados por sed
como expressões regulares.
I=$''; sed -nre "s/^([^ ]+) +/s$I$I/;s/$/$I/p"<<'EOF' |sed -f - file
foo By the middle of June,
barbar mosquitos were rampant,
foofoofoo the grass was tawny, a brown dust
barbarbarbar haze hung over the valley
EOF
(postagem original)
Você pode usar sed
como um script executável, com um wrapper ...
Você pode definir sua localização e substituir o texto em um arquivo de texto separado,
mas para esta amostra é definida em linha ...
Este script converte seus pares de localização / replicação em expressões sed
e cria dinamicamente o script executável
I=$''; set -f
printf "#!/bin/sed -f\n" > ~/bin/script.sed
while IFS= read -r line ;do
ix=$(expr index "$line" " ")
printf "s%s%s%s%s%s\n" $I ""${line:0:$((ix-1))}"" $I "${line:$ix}" $I
done <<'EOF' >> ~/bin/script.sed
$text1 By the middle of June,
$text2 mosquitos were rampant,
$text3 the grass was tawny, a brown dust
$text4 haze hung over the valley
EOF
chmod +x ~/bin/script.sed
Este é o arquivo de teste a ser modificado.
'$' está bem, pois não está no final de uma linha (para sed),
e não vai a qualquer momento ser exposto à casca
mas qualquer token que não colidir com sed
é bom. Você pode até usar #
echo '$text1 $text2 $text3 $text4' > file
Supondo que ~/bin
seja um diretório $ PATH, o comando a ser executado é:
script.sed file