如何只提取英文单词并在 bash 脚本中保留 Devanagari 单词?

How to extract only the English words and leaving the Devanagari words in bash script?

文本文件是这样的,

#एक
1के
अंकगणित8IU
अधोरेखाunderscore
$thatऔर
%redएकyellow
$चिह्न
अंडरस्कोर@_

所需的文本文件应该是这样的,

#
1
8IU
underscore
$that
%redyellow
$
@_

这是我迄今为止尝试过的方法,使用 awk

awk -F"[अ-ह]*" '{print }' filename.txt 我得到的输出是,

#
1


$that
%red
$

并使用这个 awk -F"[अ-ह]*" '{print ,}' filename.txt 我得到这样的输出,

# 
1 े
 ं
 ो
$that 
%red yellow
$ ि
 ं

有没有办法在 bash 脚本中解决这个问题?

这个sed有效吗?

sed 's/\([0-9a-zA-Z[:punct:]]*\)[^0-9a-zA-Z[:punct:]]*//g' input_file
#
1
8IU
underscore
$that
%redyellow
$
@_

使用 perl:

$ perl -CSD -lpe 's/\p{Devanagari}+//g' input.txt
#
1
8IU
underscore
$that
%redyellow
$
@_

-CSD 告诉 perl 标准流和任何打开的文件都以 UTF-8 编码。 -p 循环输入文件,在执行 -e 给出的脚本后将每一行打印到标准输出。如果要就地修改文件,请添加 -i 选项。

正则表达式匹配分配给 Unicode 标准中梵文脚本的任何代码点并将其删除。使用 \P{Devanagari} 做相反的事情并删除 non-Devanagari 个字符。

使用awk你可以做到:

awk '{sub(/[^\x00-\x7F]+/, "")} 1' file
#
1
8IU
underscore
$that
%redyellow

using [\x00-\x7F]. This matches all values numerically between zero and 127, which is the defined range of the ASCII character set. Use a complemented character list [^\x00-\x7F] to match any single-byte characters that are not in the ASCII range.

tr 非常适合这项任务:

LC_ALL=C tr -c -d '[:cntrl:][:graph:]' < input.txt

它设置 POSIX C 语言环境,以便只有美国英语字符集有效。

然后指示tr-d删除-c补充[:cntrl:][:graph:]、控制和绘制的字符类(那些不是控制或可见的)字符。由于它将所有区域设置设置为 C,所有 non-US-English 个字符都被丢弃。