Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex sed替换Linux中的ASCII字符_Regex_Linux_Bash_Sed_Hindi - Fatal编程技术网

Regex sed替换Linux中的ASCII字符

Regex sed替换Linux中的ASCII字符,regex,linux,bash,sed,hindi,Regex,Linux,Bash,Sed,Hindi,我想替换文件中的ASCII/英文字符,并在Linux环境中保留unicode字符 INSERT INTO text (old_id,old_text,old_flags) VALUES (2815829,'[[चित्र:Youth-soccer-indiana.jpg|thumb|300px|right|बचपन का खेल.एसोसिएशन फुटबॉल, ऊपर दिखाया गया है, एक टीम खेल है जो सामाजिक कार्यों को भी प्रदान कर

我想替换文件中的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表达式#1,字符23:无效范围结束

我也试过这个,它似乎有效,但并不完全有效

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

谁能告诉我如何让sed使用unicode范围regex

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

因为sed是面向行的,所以换行符(代码9是control/J)被特别处理。您的文件可能包括制表符(代码8)和回车符(代码13)。但实际上,您可能只关心制表符和可打印的ASCII

Tilde(
~
)是代码126(一些很容易知道的东西)

因此:

其中
\t
是ASCII制表符(根据具体实现,您可能需要一个文字制表符)将删除所有可打印的ASCII,保留未触及的换行符和UTF-8。

PERL

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

# this version replace each group also newlines
perl -pe 's/[[:ascii:]]/ /g;' filename
更新:使用@user1516947示例,我稍微修改了perl解决方案,将多个ascii字符折叠到一个空间中(并删除不需要的前导和尾随空格):

基于示例输入的命令行使用示例:

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范围有效):

一个可读性较差的sed版本,它也替换了所有换行符(只有一行):


要去除ascii字符,您可以在整个范围内运行它,
sed
会吃换行符,因此如果您想让换行符也消失,您需要在之后用
tr
点击它

echo-e“嗨☠ \这里☠“| LANG=C sed”s/[\x01-\x7F]//g“| tr-d'\n'

☠☠

相反,如果要删除unicode字符,可以指定unicode范围:
echo-e“嗨☠ \这里☠“| LANG=C sed”s/[\x80-\xFF]//g”

你好

在这里,

似乎是工作,但不是完全的。请简化问题。考虑把20个字符混合的ASCII和Unicode和这些字符所需的输出。你想删除ASCII,或者你的标题是“替换”。一行代码显示了一个空间字符,第二个没有显示替换字符。好运气。是的,我想删除。(替换为null)所有ascii字符,仅保留unicode印地语单词。我尝试的第二个正则表达式保留了一些特殊字符(这不是必需的)。我们已经有了您的口头描述。我们需要查看示例!通过包含示例输入(精心设计)帮助我们直观地了解您的问题,所需的输出和当前代码,以及当前输出的问题和任何错误消息。请参阅,以获取一个好的示例(不是您感兴趣的领域,而是一个组织良好的问题)。祝您好运。输入:插入到文本(旧\u id,旧\u文本,旧\u标志)值(2815829,'[[चित्र:印第安纳青年足球队。jpg |拇指| 300px |对|बचपन का खेल.एसोसिएशन फुटबॉल, ऊपर दिखाया गया है, एक टीम खेल है जो सामाजिक कार्यों को भी प्रदान करता है।]]\n\n\'\'\'खेल\'\'\', कत्पत्ति ==\n\”खेल\" (\"स्पोर्ट\") शब्द की [[पुराने फ्रेंच]] शब्द \'\'देस्पोर्ट (驱逐)\'\'से उत्पत्ति हुई है, जिसका अर्थ \"अवकाश\" है।\n\n==इतिहास ==\n\n[[चित्र:希腊雕像铁饼投掷者2世纪aC.jpg |拇指| 150px |右| 2预期输出चित्र बचपन का खेल.एसोसिएशन फुटबॉल, ऊपर दिखाया गया है, एक टीम खेल है जो सामाजिक कार्यों को भी प्रदान करता है关于
sed
作全面的陈述是不可靠的,因为存在多个不兼容的版本,即使仅在Linux上也是如此。我会坚持使用Perl来实现可移植性。@tripleee:你说得对,我编辑了响应以指定sed实现(gnu).根据您的经验,这就足够了?是的,肯定是一个进步,尽管我的投票结果是。@tripleee Thomas显示了对ascii代码的深入了解,但它的解决方案在Linux(请求的环境)中不起作用公平地说,尽管我根本不相信OP想要压扁新词。
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'
 चित्र बचपन का खेल एसोसिएशन फुटबॉल ऊपर दिखाया गया है एक टीम खेल है जो सामाजिक कार्यों को भी प्रदान करता है। खेल कत्पत्ति खेल स्पोर्ट शब्द की पुराने फ्रेंच शब्द देस्पोर्ट से उत्पत्ति हुई है जिसका अर्थ अवकाश है। इतिहास चित्र
# 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