Ich bin mir nicht ganz sicher, ob ich richtig verstehe, was Du da vorhast. Jedenfalls ist
grep -o '(Front Left).*([0-9]*)%\2'
das Gleiche wie:
grep -0 'Front Left.*[0-9]*%[0-9]*'
Die Backreference (\n) ist in diesem Falle bloß eine kürzere Schreibweise, die es Dir erspart einen identischen Ausdruck zweimal anzugeben. Mir ist keine Möglichkeit bekannt, mit grep den sed-Einzeiler zu ersetzen; ich bin aber auch kein Guru auf dem Gebiet.
So wie ich das sehe, musst Du zuerst die entsprechende Zeile rausfiltern, und dann die Zahl, ungefähr so:
grep ' Front Left' | grep '[0-9]*%'
dann noch in tr -d '%' pipen, um das Prozentzeichen loszuwerden:
% amixer get PCM | grep ' Front Left' | grep -o '[0-9]*%' | tr -d '%'
Vielleicht geht es auch noch eleganter, mir fällt allerdings nichts ein. Ich würde sagen, dass bei diesem Problem grep einfach nicht das richtige Tool ist.
Bei dem Ansatz mit sed passiert folgendes:
sed -ne '/ Front Left/s/.*[(.*)%].*/\1/p'
/ Front Left/ sucht die Zeile(n) aus, die mit dem 's'-Befehl bearbeitet werden. Dieser funktioniert folgendermaßen: s/x/y/p -> suche x und ersetze es mit y, dann gib das Ergebnis aus. x ist in diesem Falle die gesamte Zeile, y ist eine Backreference auf (.*), also beliebig viele Zeichen die, in diesem Fall, zwischen 2 eckigen Klammern und vor einem Prozentzeichen stehen. (Hier ist die Backreference nicht bloß eine Abkürzung wie bei grep, da es im 'y'-Teil des 's'-Befehls steht)
Damit der ganze Rest gematcht wird, muss noch vor und nach dem eigentlichen Ausdruck jeweils ein '.*', ansonsten würde er ja vom 's'-Befehl nicht ausgeschnitten.
Es wird also die Zeile genommen, die mit Front Left beginnt und Alles ausgeschnitten, was nicht vor einem Prozentzeichen und zwischen eckigen Klammern steht.
Alles in allem ein Bisschen viel für das arme grep 😉
HTH
Achso, das hier hat mir beim kennenlernen von sed sehr geholfen:
http://www.gnu.org/software/sed/manual/html_chapter/sed_toc.html
kann man sich da auch runterladen.