Kennen Sie eine bessere oder einfachere Art und Weise, sed oder Bash zu verwenden, um vom letzten Auftreten einer Regex-Übereinstimmung vom Ende einer Zeile zu ersetzen, ohne rev
zu verwenden?Ersetzen von Nth Auftreten vom Ende der Linie über Sed
Hier ist der rev
Weg, um den dritter von den letzten Auftreten des Buchstabe ‚s‘ – noch nach vorn passend zu entsprechen, noch rev
aus dem letzten Zeichen zu verwenden.
echo "a declaration of sovereignty need no witness" | rev | sed 's/s/S/3' | rev
a declaration of Sovereignty need no witness
aktualisieren - eine verallgemeinerte Lösung auf Basis von Cyruses Antwort:
SEARCH="one"
OCCURRENCE=3
REPLACE="FOUR"
SED_DELIM=$'\001'
SEARCHNEG=$(sed 's/./[^&]*/g' <<< "${SEARCH}")
sed -r "s${SED_DELIM}${SEARCH}((${SEARCHNEG}${SEARCH}){$((${OCCURRENCE}-1))}${SEARCHNEG})\$${SED_DELIM}${REPLACE}\1${SED_DELIM}" <<< "one one two two one one three three one one"
Hinweis: Um wirklich generisch sein es regex Elemente aus der LHS entkommen sollte.
Bitte nehmen Sie sich einen Blick auf [Bearbeitungshilfe] (http://stackoverflow.com/editing-help). – Cyrus