$ echo ABC | awk '$0 ~ /^[a-b]/'
ABC
$ echo ABC | awk '$0 ~ /^[a-a]/'
$ echo ABC | awk '$0 ~ /^a/'
$
Sie sehen. /[a-b]/
erfasst A
, aber /[a-a]/
oder /a/
nicht. Warum?
$ echo ABC | awk '$0 ~ /^[a-b]/'
ABC
$ echo ABC | awk '$0 ~ /^[a-a]/'
$ echo ABC | awk '$0 ~ /^a/'
$
Sie sehen. /[a-b]/
erfasst A
, aber /[a-a]/
oder /a/
nicht. Warum?
Antworten:
Ich denke, es ist ein "Gebietsschema" -Problem.
In meinem Gebietsschema it_IT das folgende Snippet
if [[ a < A ]]; then
echo "a < A"
elif [[ a > A ]]; then
echo "a > A"
else
echo "a = A"
fi
if [[ b < A ]]; then
echo "b < A"
elif [[ b > A ]]; then
echo "b > A"
else
echo "b = A"
fi
zeigt an
a < A
b > A
das A
ist also (überraschenderweise) zwischen a
und b
, also im bereich.
Versuchen Sie es auszuführen
echo ABC | LC_COLLATE=C awk '$0 ~ /^[a-b]/'
Bearbeiten
Der folgende Befehl zeigt die Sortierreihenfolge in Ihrem Gebietsschema an:
echo $(LC_COLLATE=C printf '%s\n' {A..z} | sort)
Die Ausgabe auf meinem Computer ist
` ^ _ [ ] a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y z Z
(kann auf der Handbuchseite von bash nicht verstehen, ob Sequenzausdrücke in der Reihenfolge der Sortierung des Gebietsschemas erweitert sind oder nicht; es scheint nicht).
sort
, join
beginne ich meine Skripte mit export LC_COLLATE=C
. Jetzt muss ich auf diese Weise auch Skripte mit awk
:)