Zamiana [0-9] na [AJ] nie działa z sed

11

Pracuję nad poleceniem, które zastępuje wszystkie cyfry 0–9 odpowiadającymi im literami w sed. Wiem, że robię coś źle, ale sed nie interpretuje wyrażenia zastępczego jako nic innego jak dosłowny ciąg znaków.

Polecenie, którego używam, to sed -r 's/[0-9]/[A-J]/g' log > ~/output.txt

Wydaje mi się to dość proste, ale utknąłem na nim przez około godzinę. Dane wyjściowe, które otrzymuję, zastępują 0–9 ciągiem „[AJ]”

Matthew Snell
źródło

Odpowiedzi:

38

W zamianie tylko dopasowanie (lewa strona) jest wyrażeniem regularnym. Wymiana jest mniej więcej po prostu ciągiem znaków (z jakiejś ekspansji backslash) - to nie regex .

Chcesz transliteracji, a nie zastąpienie, więc zastąpić sz y:

echo 34031445 | sed 'y/0123456789/ABCDEFGHIJ/'

sed nie może używać zakresów y, ale Perl może:

echo 34031445 | perl -pe 'y/0-9/A-J/'

Lub po prostu użyj tr:

echo 34031445 | tr 0-9 A-J
choroba
źródło
12
Zgoda. trjest najłatwiejszym i prawdopodobnie najszybszym narzędziem do tego zadania.
sdkks,