2015-11-12 3 views
2

Я хочу, чтобы заменить ASCII/английские символы в файле и сохранить символы Юникода в среде LinuxSED заменяющие символы ASCII в Linux

INSERT INTO text (old_id,old_text,old_flags) VALUES (2815829,'[[चित्र:Youth-soccer-indiana.jpg|thumb|300px|right|बचपन का खेल.एसोसिएशन फुटबॉल, ऊपर दिखाया गया है, एक टीम खेल है जो सामाजिक कार्यों को भी प्रदान करता है।]]\n\n\'\'\'खेल\'\'\', कई [[नियमों]] एवं [[रिवाजों]] द्वारा संचालित होने वाली एक [[प्रतियोगी]] गतिविधि है। \'\'खेल\'\' 

Я пытался

~$ sed 's/[^\u0900-\u097F]/ /g' hi.text but the range 

, но я получаю

sed: -e выражение # 1, char 23: Недопустимый конец диапазона

Я также попробовал это, и это, кажется, работает, но не в полной мере

sed 's/[a-zA-Z 0-9`[email protected]#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' enwiki-latest-pages-articles-multistream_3.sql >result.txt 

Может кто-нибудь сказать мне, как получить СЭД работает с регулярным выражением диапазон Юникода

+0

, что вы имеете в виду *, кажется, работает но не полностью *? –

+1

, пожалуйста, упростите проблему. Рассмотрите возможность размещения 20 символов смешанного ascii и unicode и требуемой информации из этих символов. Вы хотите удалить ascii, или как ваш заголовок говорит «replace». Одна строка кода показывает пробел, второй - отсутствие символа перезаписи. Удачи. – shellter

+0

Да, я хочу удалить (заменить нулем) все символы ascii и сохранить только слова хинди unicode. Второе регулярное выражение, которое я пробовал, сохраняет некоторые специальные символы (что не обязательно). – gaurus

ответ

4

ASCII коды находятся в диапазоне от 0 до 127 включительно. Из этого диапазона 0-31 и 127 являются управляющими символами. Unicode, кодированный как UTF-8, использует байты данных из диапазона от 128 до 255 включительно.

Поскольку sed ориентирован на линию, новая линия (код 9 является элементом управления/J) обрабатывается специально. В вашем файле может включить вкладку (код 8) и возврат каретки (код 13). Но на практике вам, скорее всего, нужны только вкладки и ASCII для печати.

Тильда (~) - код 126 (что-то удобное для ознакомления).

Итак:

sed -e 's/[ -~\t]/ /g' 

где \t является вкладкой ASCII (и в зависимости от реализации, вам могут понадобиться вкладка буквальной) удалит все печати ASCII, оставляя нетронутую новую строку и UTF-8.

1

PERL

Если вы не возражаете, используя Perl попробовать мнемонические:

# this version replace each group also newlines 
perl -pe 's/[[:ascii:]]/ /g;' filename 

UPDATE: Использование @ user1516947 примере я немного изменил решение PERL разрушаться несколько ASCII (и удалить ненужные передние и задние пробелы):

perl -pe 's/[[:ascii:]]+/ /g; s/^\s+|\s+$//g' filename 

Команда Пример использования линии на основе ввода пробы:

echo "INSERT INTO text (old_id,old_text,old_flags) VALUES (2815829,'[[चित्र:Youth-soccer-indiana.jpg|thumb|300px|right|बचपन का खेल.एसोसिएशन फुटबॉल, ऊपर दिखाया गया है, एक टीम खेल है जो सामाजिक कार्यों को भी प्रदान करता है।]]\n\n\'\'\'खेल\'\'\', कत्पत्ति ==\n\"खेल\" (\"स्पोर्ट\") शब्द की [[पुराने फ्रेंच]] शब्द \'\'देस्पोर्ट (desport)\'\' से उत्पत्ति हुई है, जिसका अर्थ \"अवकाश\" है।\n\n== इतिहास ==\n\n[[चित्र:Greek statue discus thrower 2 century aC.jpg|thumb|150px|right|2" | perl -pe 's/[[:ascii:]]+/ /g; s/^\s+|\s+$//g' 

Выход:

चित्र बचपन का खेल एसोसिएशन फुटबॉल ऊपर दिखाया गया है एक टीम खेल है जो सामाजिक कार्यों को भी प्रदान करता है। खेल कत्पत्ति खेल स्पोर्ट शब्द की पुराने फ्रेंच शब्द देस्पोर्ट से उत्पत्ति हुई है जिसका अर्थ अवकाश है। इतिहास चित्र 

(GNU) SED

Или в СЭД (в Linux среде вы должны изменить LANG окр к сделайте седельный радиус действительным):

# this version does not replace newlines 
LANG=C sed 's/[\d0-\d127]/ /g' filename 

А меньше читаемый СЭД версия, которая заменяет все символы новой строки (но один) тоже:

LANG=C sed ':a;N;$!ba;s/[\d0-\d127]/ /g' filename 
+0

Выполнение широких подробных заявлений о' sed' является неустойчивым, потому что существует много несовместимых версий, даже только на Linux Я бы придерживался Perl для переносимости – tripleee

+0

@ tripleee: вы правы, я отредактировал ответ, чтобы указать реализацию (gnu). По вашему опыту, этого достаточно? –

+0

Да, конечно, улучшение, хотя мой голос идет на ответ Томаса (http://stackoverflow.com/a/33670413/874188). – tripleee

1

Чтобы избавиться от символов ASCII вы можете запустить его в диапазоне, sed ест новую строку, хотя, так что если вы хотите, чтобы эти переборщили вам нужно попасть это с tr впоследствии.

echo -e "hi ☠ \nthere ☠" | LANG=C sed "s/[\x01-\x7F]//g" | tr -d '\n'
☠☠

И наоборот, если вы хотите, чтобы избавить Юникода можно указать вместо диапазон Юникода: echo -e "hi ☠ \nthere ☠" | LANG=C sed "s/[\x80-\xFF]//g"
привет
там

Смежные вопросы