Próbuję utworzyć polecenie sed, które kapitalizuje zaimek I w pliku tekstowym. Na przykład „lubię psy”. powinno być „Lubię psy”. Do tej pory mam:
sed 's/ i / I /g'
To nie działa w wielu różnych scenariuszach. Jak gdyby nie ma znaków interpunkcyjnych po I .
Oto lista scenariuszy, o których pomyślałem, że polecenie powinno być w stanie obsłużyć:
- W jednym wierszu tekstu znajduje się wiele „ i ”. Myślę, że można temu zaradzić, mając
g
flagę na końcu. - „ I ” ma wokół siebie znaki interpunkcyjne. Na przykład przecinek lub kropka po nim, cytat lub nawias przed nim lub po nim.
- „ I ” to pierwszy lub ostatni znak w linii. Oznacza to, że nie można po prostu sprawdzić odstępów lub interpunkcji.
- Każde zwykłe „ ja ” w słowie jest pozostawione w spokoju. Na przykład „f I Opłaty i ghter” nie powinien być przekształcony „f I Opłaty ja ghter”.
źródło
i i
przypadku jest dwukrotne zastosowanie transformacji. Można to osiągnąć przez jednego polecenia:sed -e 's…' -e 's…'
.Proste rozwiązanie (z GNU sed):
Jest to w zasadzie ta sama koncepcja, co druga odpowiedź - zamień „i” na „ja”, jeśli nie jest to część większego słowa.
\b
wydaje się nie być wspomniany na stronie podręcznika sed, ale wyjaśniono to w Podręczniku GNU sed :Nawet instrukcja nie mówi wprost (ale przykład pokazuje), że
\b
pasuje do początku i końca linii. Nie pasuje do żadnych znaków; dopasowuje ciąg pusty, który pojawia się między znakiem „słowa” a znakiem „nie słowa” (w dowolnej kolejności) lub na początku i na końcu linii (jak^
i$
). Więc nie musimy się martwić o przechwycenie (za pomocą\(
...\)
) postaci, które pasują, i zastąpienie ich przez\1
i\2
. Ponieważ\b
nie pasuje do żadnych znaków, to polecenie działa nai i
(zmieniając je naI I
).źródło