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 stdout
wie 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 ed
Skript 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