Если кавычки нельзя вложить или экранировать, просто разделите ввод на кавычки, измените каждый нечетный элемент и снова соедините кавычками:
#!/usr/bin/perl
use warnings;
use strict;
my $input = '"----, ----",, ----, ----,,"",start quote," starting
next line with end quote, ",---,, "---,", "begin quote,,
,,nxt line end quote ",----, ----",, ----, "----,,"---","",
----,","----, ----",,"", --",--,----,,,';
my @segments = split /"/, $input; # fix SO syntax highlighting: "
s/,/@/g for @segments[ grep $_ % 2, 0.. $#segments ];
print join '"', @segments;
Это зависит от порядка сортировки в вашей локали.
Порядок сортировки — это набор правил для каждой локали, которые позволяют упорядочивать буквы с диакритическими знаками (, например, ñ
будет стоять после n
, но перед o
в испанском языке ).
Но это не так, порядок сортировки также указывает, какие символы следует игнорировать при сортировке. Для локали "C" учитываются все символы, но для "en _US", например, тире (U002D )игнорируется, как и для большинства других локалей, так как они наследуют определения от iso14651 _t1 _общий (в /usr/share/i18n/locales/ в некоторых дистрибутивах ).
Таким образом, порядок для вашего первого файла не представляет проблемы, поскольку, когда вы игнорируете тире, вы получаете простое сравнение по алфавиту:
-- ignore dashes --> -- sort -->
0- 0 0
01- 01 01
Когда вы добавляете букву «Т», все меняется, почему? Потому что теперь, если вы проигнорируете тире, вам придется сравнивать «1» и «Т» (, первый символ один и тот же ), а «1» стоит перед «Т» :
. -- ignore dashes --> -- sort -->
0-T 0T 01T
01-T 01T 0T
Таким образом, рекомендуется всегда убедиться, что вы используете правила "C", используя LC _COLLATE=C при сортировке.
В вашем случае:
$ cat <<EOF | LC_COLLATE=C sort
0-T
01-T
EOF
дает:
0-T
01-T
Как вы и ожидали.
Да, это может показаться раздражающим. (в локали по умолчанию en _US.UTF -8)
$ printf '%s\n' 1 1- 1-a 11- 11-a | sort
1
1-
11-
11-a
1-a
Причина в том, что -
назначается no weight
для порядка сортировки.
Аналогично тому, что должен делать "
:
printf '%s\n' 1 \"1\" 1- \"1-\" 1-a \"1-a\" 11- \"11-\" 11-a \"11-a\" | sort
"1"
"1-"
1
1-
"11-"
11-
"11-a"
11-a
"1-a"
1-a
Как вы можете видеть выше, все 1 сортируются вместе, все 11
также. Проблема в том, что 1-a
сортируется больше как 1a
, чем что-либо еще :
printf '%s\n' 1-a 1-b 1-c 1a 1b 1c| sort
1-a
1a
1-b
1b
1-c
1c
Вопрос о том, следует ли включать пунктуацию (-
, "
, ;
и другие )в порядок сортировки сопоставления, является спорным. Преобладающее мнение состояло в том, что это не должно (в локалях, отличных от -ASCII ).
Общий файл для большинства латинских языков — /usr/share/i18n/locales/iso14651_t1_common
. В этом файлеHYPHEN-MINUS
(да то, что мы, говоря простым языком, называем тире. Unicode U -002D )порядок сортировки установлен на:
<U002D> IGNORE;IGNORE;IGNORE;<U002D> % HYPHEN-MINUS
То есть игнорировать первые три уровня сопоставления.