user_unknown schrieb:
Das Ersetzen von / in Sedbefehlen durch beliebige, andere Trenner ist entweder nicht trivial, oder das Triviale daran ist mir noch nicht klar geworden.
In diesem Fall ist das Problem das Dollarzeichen:
Ist mir auch schon passiert, dass es nicht klappt aber die Regelmäßigkeit, nach der es nicht klappt, habe ich noch nicht ergründet.
Problematisch sind halt immer Zeichen, die Metabedeutungen in der Shell haben oder mit solchen interagieren (wie in diesem Fall).
Mit Slashes und Maskierung geht's:
Man muss auch nur das Dollarzeichen maskieren, weil es in der Kombination $# in einer Zeichenkette mit doppelten Anführungsstrichen expandiert wird. Das reicht.
Es zeigt sich mal wieder, dass set -x ein hervorragendes Werkzeug zum Finden solcher Pannen ist. So habe ich das untersucht:
| $ set -x
+ set -x
$ alias letzte="find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed 's#.list$##;s#.*/##' | sort "
+ alias 'letzte=find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed '\''s#.list0#;s#.*/##'\'' | sort '
$ letzte
+ sed 's#.list0#;s#.*/##'
+ sort
+ find /var/lib/dpkg/info/ -daystart '(' -name '*.list' -a -mtime -3 ')'
sed: -e expression #1, char 13: unknown option to `s'
|
In Zeilen 4 und 6 sieht man, dass da auf einmal eine Null auftaucht, die nicht in der Alias-Definition steht. Mit Maskierung geht es:
| $ alias letzte="find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed 's#.list\$##;s#.*/##' | sort "
+ alias 'letzte=find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed '\''s#.list$##;s#.*/##'\'' | sort '
$ letzte
+ sed 's#.list$##;s#.*/##'
+ sort
+ find /var/lib/dpkg/info/ -daystart '(' -name '*.list' -a -mtime -3 ')'
...
|
Man kann auch das Quoting komplett auf einfache Anführungsstriche umstellen, was aber ein wenig mühsam ist:
| $ alias letzte='find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed '\''s#.list$##;s#.*/##'\'' | sort'
+ alias 'letzte=find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed '\''s#.list$##;s#.*/##'\'' | sort'
$ letzte
+ sed 's#.list$##;s#.*/##'
+ sort
+ find /var/lib/dpkg/info/ -daystart '(' -name '*.list' -a -mtime -3 ')'
...
|
Oder man nimmt eine Shell-Funktion
| $ letzte(){ find /var/lib/dpkg/info/ -daystart \( -name \*.list -a -mtime -3 \) | sed 's#.list$##;s#.*/##' | sort; }
+ sed 's#.list$##;s#.*/##'
+ find /var/lib/dpkg/info/ -daystart '(' -name '*.list' -a -mtime -3 ')'
$ letzte
+ sed 's#.list$##;s#.*/##'
+ sort
+ find /var/lib/dpkg/info/ -daystart '(' -name '*.list' -a -mtime -3 ')'
...
|
Die Ausgaben habe ich immer abgeschnitten.