Ralph Müller <rmue@gmx.de> wrote:
ich möchte gerne das letzte Zeichen (hex. "A1") einer Datei löschen. Da ich viele derartige Dateien habe suche ich nach einem entsprechenden Befehl; ob auf Basis Bash, Perl, usw. ist egal.
Beispielsweise so: find . -type f -print | while read f; do head -c $(expr $(ls -l $f |awk '{print $5}') - 1) $f >$f.new \ && mv $f.new $f done
Wenn ich in Perl ein chomp(@lines) mache wird leider das letzte Zeichen _jeder_ Zeile gelöscht.
Das stimmt so nicht! "chop" entfernt das letzte Zeichen eines Strings, während "chomp" den String vom Ende eines Strings entfernt, der durch die Perl-Variable $/ bezeichnet wird; dies ist normalerweise das Newline-Zeichen. Wenn nur das letzte Zeichen der Dateien 0xa1 ist, kann man das in Perl auch so lösen: perl -i.bak -e '$/="\xa1";while(<>){chomp;print}' datei1 ... Wenn die Zeichen allerdings öfter in der Datei vorkommen, werden alle entfernt.
Bei dem Befehl "tr" (Bash) blicke ich noch nicht so ganz durch.
tr ist kein Bash-interner Befehl, sondern ein eigenständiges Programm. $ type tr tr is /usr/bin/tr
Dort müßte man das Zeichen offenbar als "Oktalwert" angeben. Ein Schritt nach vorne wäre wenn mir jemand sagen könnte wie ich einen Hexwert ("A1") in den entsprechenden Oktalwert übersetzen kann.
Das geht mit bc: $ bc bc 1.05 Copyright 1991, 1992, 1993, 1994, 1997, 1998 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. ibase=16 obase=8 A1 241 Tschüss Jens -- (Intentionally left blank.)