Mehrzeiliges Ersetzen in der Shell

Mehrzeiliges Ersetzen in der Shell

Ich habe folgende Textblöcke in einer Textdatei:

* Exported from Foo *

Title and Section

und ein anderer

* Exported from Foo *

Other Title and Other Section

Ich muss dies ersetzen durch

# Title and Section

Und

# Other Title and Other Section

Jetzt kann ich dies tun mit:

echo "$(grep -A 2 "Exported from Foo" ../tmp/data/${nospacefile} | grep -v "Exported from Foo" | grep -v -- -- | tr -d '\r' | grep -v -e '^[[:space:]]*$' | sed -e 's/^[ \t]*//')" | while read -r title; do sed -i -e "s/^\([[:blank:]]*\)$title/\# $title/g" ../tmp/data/${nospacefile}; done

Allerdings erscheint die Zeichenfolge „Titel und Abschnitt“ oder „Anderer Titel und anderer Abschnitt“ auch an Stellen, die ich nicht ersetzen möchte. Ich möchte sie nur ersetzen, wenn sie nach der exportierten Zeile und einer leeren Zeile erscheint.

Welche Shell-Konstruktion ist hierfür am besten geeignet? Ich sende stdout gerne an Perl, Python usw.

Antwort1

Sie können versuchen ed(1), die dritte Zeile ab zu bearbeiten, * Exported from Foo *unabhängig davon, ob die zweite Zeile leer ist oder nicht.

Um die Ausgabe einfach stdoutwie sed auszudrucken

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' ,p Q | ed -s file.txt 

Dadurch wird die Ausgabe einfach gedruckt stdout, damit Sie die Datei direkt bearbeiten können.

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' w | ed -s file.txt 

Um ein edSkript zu verwenden, das nur die Ausgabe druckt aufstdout

cat script.ed

Ausgabe

g/^\* Exported from Foo \*$/+2s/^/# /
,p
Q

Das Skript, das die Datei bearbeitetin-place

g/^\* Exported from Foo \*$/+2s/^/# /
w
q

Jetzt können Sie

ed -s file.txt < script.ed

verwandte Informationen