UPDATE : o script python do loevborg é certamente a solução mais simples e melhor (não há dúvida sobre isso) e estou muito feliz com isso, mas gostaria de salientar que o script bash Eu apresentei (no final da questão) não é nem de longe tão complicado quanto parece .. Eu aparado toda a escória de depuração que eu usei para testá-lo .. e aqui está novamente sem o overburden (para quem visita esta página) .. É basicamente um sed
one-liner, com pré e pós hex-conversões:
F=("$haystack" "$needle" "$replacement")
for f in "${F[@]}" ; do cat "$f" | hexdump -v -e '1/1 "%02x"' > "$f.hex" ; done
sed -i "s/$(cat "${F[1])}.hex")/$(cat "${F[2])}.hex")/p" "${F[0])}.hex"
cat "${F[0])}.hex" | xxd -r -p > "${F[0])}"
# delete the temp *.hex files.
Apenas para jogar meu chapéu no ringue, eu criei uma solução 'sed' que não vai ter problemas com caracteres regex especiais , porque não usa nem um! .. em vez disso, ele funciona em versões Hexdumped dos arquivos ...
Eu acho que é muito "top pesado", mas funciona, e aparentemente não é restrito por quaisquer limitações de tamanho. O GNU sed tem um tamanho de buffer padrão ilimitado, e é aí que o Hexdump bloco de linhas de pesquisa termina .. Então está tudo bem a esse respeito ...
Eu ainda estou procurando por uma solução diff
, porque ela será mais flexível em relação ao espaço em branco (e eu esperaria; mais rápido) ... mas até então .. É o famoso Sr. Sed. :)
Este script está totalmente funcionando como está e é razoavelmente comentado ...
Parece maior que seja; Eu tenho apenas 7 linhas de código essencial.
Para um teste semi-realista, ele faz o download do livro "Alice Through the Looking Glass" do Project Gutenberg (363.1 KB) ... e substitui o poema original de Jabberwocky por uma versão invertida de si mesma. (Curiosamente, não é muito diferente lê-lo de trás para frente :)
PS. Eu só percebi que uma fraqueza nesse método é se o seu original usa \ r \ n (0xODOA) como sua nova linha, e seu "texto para correspondência" é salvo com \ n (0x0A) .. então este processo de correspondência está inativo no água ... ('diff' não tem esses problemas) ...
# In a text file, replace one block of lines with another block
#
# Keeping with the 'Jabberwocky' theme,
# and using 'sed' with 'hexdump', so
# there is no possible *special* char clash.
#
# The current setup will replace only the first instance.
# Using sed's 'g' command, it cah change all instances.
#
lookinglass="$HOME/Through the Looking-Glass by Lewis Carroll"
jabberwocky="$lookinglass (jabberwocky)"
ykcowrebbaj="$lookinglass (ykcowrebbaj)"
##### This section if FOR TEST PREPARATION ONLY
fromURL="http://www.gutenberg.org/ebooks/12.txt.utf8"
wget $fromURL -O "$lookinglass"
if (($?==0))
then echo "Download OK"
else exit 1
fi
# Make a backup of the original (while testing)
cp "$lookinglass" "$lookinglass(fromURL)"
#
# Extact the poem and write it to a file. (It runs from line 322-359)
sed -n 322,359p "$lookinglass" > "$jabberwocky"
cat "$jabberwocky"; read -p "This is the original.. (press Enter to continue)"
#
# Make a file containing a replacement block of lines
tac "$jabberwocky" > "$ykcowrebbaj"
cat "$ykcowrebbaj"; read -p "This is the REPLACEMENT.. (press Enter to continue)"
##### End TEST PREPARATION
# The main process
#
# Make 'hexdump' versions of the 3 files... source, expected, replacement
cat "$lookinglass" | hexdump -v -e '1/1 "%02x"' > "$lookinglass.xdig"
cat "$jabberwocky" | hexdump -v -e '1/1 "%02x"' > "$jabberwocky.xdig"
cat "$ykcowrebbaj" | hexdump -v -e '1/1 "%02x"' > "$ykcowrebbaj.xdig"
# Now use 'sed' in a safe (no special chrs) way.
# Note, all files are now each, a single line ('\n' is now '0A')
sed -i "s/$(cat "$jabberwocky.xdig")/$(cat "$ykcowrebbaj.xdig")/p" "$lookinglass.xdig"
##### This section if FOR CHECKING THE RESULTS ONLY
# Check result 1
read -p "About to test for the presence of 'jabberwocky.xdig' within itself (Enter) "
sed -n "/$(cat "$jabberwocky.xdig")/p" "$jabberwocky.xdig"
echo -e "\n\nA dump above this line, means: 'jabberwocky' is as expected\n"
# Check result 2
read -p "About to test for the presence of 'ykcowrebbaj.xdig' within itself (Enter) "
sed -n "/$(cat "$ykcowrebbaj.xdig")/p" "$ykcowrebbaj.xdig"
echo -e "\n\nA dump above this line, means: 'ykcowrebbaj' is as expected\n"
# Check result 3
read -p "About to test for the presence of 'lookinglass.xdig' within itself (Enter) "
sed -n "/$(cat "$ykcowrebbaj.xdig")/p" "$lookinglass.xdig"
echo -e "\n\nA dump above this line, means: 'lookinglass' is as expected\n"
# Check result 4
read -p "About to test for the presence of 'lookinglass.xdig' within itself (Enter) "
sed -n "/$(cat "$jabberwocky.xdig")/p" "$lookinglass.xdig"
echo -e "\n\nNo dump above this line means: 'lookinglass' is as expected\n"
##### End of CHECKING THE RESULTS
# Now convert the hexdump to binary, and overwrite the original
cat "$lookinglass.xdig" | xxd -r -p > "$lookinglass"
# Echo the "modified" poem to the screen
sed -n 322,359p "$lookinglass"
echo -e "\n\nYou are now looking at the REPLACEMENT text (dumped directly from the source 'book'"