Ich versuche, jeden zweiten Vokal in einem Wort rot hervorzuheben. Was mache ich falsch?
cat room.txt | sed 's:[AEIOU]:$(printf "${\e[1;30m}&${\e[0m}"):i2'
P.S. Entschuldigen Sie die Unklarheit.
Ich möchte, dass der 2. Vokal jedes Wortes rot hervorgehoben wird.
Antwort1
- Die Befehlsersetzung erfolgt nicht in einfachen Anführungszeichen, Sie müssen stattdessen doppelte Anführungszeichen verwenden.
\e[1;30m
ist keine Variable, daher können Sie nichts tun${\e[1;30m}
.
Versuchen:
sed 's:[AEIOU]:'"$(printf "\e[1;30m&\e[0m")"':i2' room.txt
Hier schließe ich das einfache Anführungszeichen, verwende dann doppelte Anführungszeichen und öffne das einfache Anführungszeichen anschließend wieder.
Antwort2
Sie verstehen die Konstruktion sed
von falsch s///2
. Das wird nicht jedes zweite Wort ausführen, sondern nur die zweite Übereinstimmung in jeder Zeile. Um den zweiten Vokal jedes Wortes hervorzuheben, müssen Sie zuerst die Wörter identifizieren. Eine einfache Möglichkeit besteht darin, Leerzeichen in Zeilenumbrüche umzuwandeln, Ihre auszuführen sed
und dann wieder zurück umzuwandeln:
tr ' ' $'\n' < room.txt |
sed 's:[AEIOU]:'"$(printf "\e[1;31m&\e[0m")"':i2' |
tr $'\n' ' '
Das gibt jedoch einen String ohne abschließende Zeilenumbrüche zurück. Um das hinzuzufügen, einfach echo
das Ganze:
echo $(tr ' ' $'\n' < room.txt |
sed 's:[AEIOU]:'"$(printf "\e[1;31m&\e[0m")"':i2' | tr $'\n' ' ' )