繁体   English   中英

sed替换Linux中的ASCII字符

[英]sed replacing ASCII characters in Linux

我想替换文件中的ASCII /英文字符并在Linux环境中保留unicode字符

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 expression#1,char 23:无效的范围结束

我也试过这个,它似乎工作但不完全

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

任何人都可以告诉我如何让sed使用unicode范围正则表达式

ASCII码的范围为0到127(含)。 在该范围内,0-31和127是控制字符。 编码为UTF-8的Unicode使用128到255(包括128和255)范围内的数据字节。

因为sed是面向行的,所以专门处理换行符(代码9是control / J)。 您的文件可能包含选项卡(代码8)和回车符(代码13)。 但在实践中,您可能只关心选项卡和可打印的ASCII。

Tilde( ~ )是代码126(知道的东西很方便)。

所以:

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

其中\\t是ASCII选项卡(根据实现情况,您可能需要一个文字选项卡)将删除所有可打印的ASCII,保留未触摸的换行符和UTF-8。

PERL

如果您不介意使用perl,请尝试使用助记符:

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

更新 :使用@ 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

或者在sed中(在linux环境中你必须修改LANG env以使sed范围有效):

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

一个不太可读的sed版本,它也取代了所有换行符(但也取而代之):

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

为了摆脱ascii字符,你可以在范围内运行它, sed吃新行,但是如果你想要那些已经消失,你需要用tr来打它。

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

相反,如果你想摆脱unicode字符,你可以指定unicode范围: echo -e "hi ☠ \\nthere ☠" | LANG=C sed "s/[\\x80-\\xFF]//g" echo -e "hi ☠ \\nthere ☠" | LANG=C sed "s/[\\x80-\\xFF]//g"

那里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM