UPDATE : Loevborgs Python-Skript ist sicherlich die einfachste und beste Lösung (daran besteht kein Zweifel) und ich bin sehr zufrieden damit, aber ich möchte darauf hinweisen, dass das Bash-Skript, das ich vorgestellt habe (am Ende der Frage) ist bei weitem nicht so kompliziert wie es aussieht. Ich habe all die Debugging-Krätze herausgeschnitten, die ich zum Testen verwendet habe. Und hier ist es wieder ohne Überlastung (für jeden, der diese Seite besucht). Es ist im Grunde ein sed
Einzeiler mit Hex-Conversions vor und nach:
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.
Um meinen Hut in den Ring zu werfen, habe ich eine "sed" -Lösung gefunden, die bei speziellen Regex-Zeichen keine Probleme verursacht , da nicht einmal eine verwendet wird! .. stattdessen funktioniert es auf Hexdumped-Versionen der Dateien ...
Ich denke , es ist zu „kopflastig“, aber es funktioniert, und wird offenbar nicht durch Größenbeschränkungen eingeschränkt .. GNU sed eine unbegrenzte hat Muster Puffergröße, und das ist , wo der Hexdumped Block von Suchlinien endet .. So In dieser Hinsicht ist es okay ...
Ich bin immer noch auf der Suche nach einer diff
Lösung, weil sie in Bezug auf Leerraum flexibler sein wird (und ich würde erwarten; schneller) ... aber bis dahin ... ist es der berühmte Mr. Sed. :) :)
Dieses Skript läuft vollständig wie es ist und wird vernünftigerweise kommentiert ...
Es sieht größer aus als es ist; Ich habe nur 7 Zeilen wesentlichen Codes.
Für einen semi-realistischen Test lädt es das Buch "Alice durch den Spiegel" von Project Gutenberg (363,1 KB) herunter ... und ersetzt das ursprüngliche Jabberwocky-Gedicht durch eine zeilenumgekehrte Version von sich selbst. (Interessanterweise ist es nicht viel anders rückwärts lesen :)
PS. Ich habe gerade festgestellt, dass eine Schwachstelle bei dieser Methode darin besteht, dass Ihr Original \ r \ n (0xODOA) als Zeilenumbruch verwendet und Ihr "übereinstimmender Text" mit \ n (0x0A) gespeichert wird Wasser ... ('diff' hat keine solchen Probleme) ...
# 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'"