regex 排除变音符号等特殊字母时的Grep

ycl3bljg  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(137)

我正在运行Mint Xfce,并尝试使用以下命令从终端执行grep:

grep -E -o '^[A-Za-z]{1,}\s[A-Za-z]{1,}\s[0-9]{1,}' sourcefile.txt | sort -f > newfile.txt

源文件是一个文本文件,其中每一行看起来像

<string><space><string><tab><number><tab><number><tab>...

其中字符串具有字母、数字、标点符号和特殊字符,并且数字是整数。
我的目标是提取两个字符串和的第一个数字,只提取字符串只包含英语字母(a-z,大写或小写)的行。
上面的命令忽略了带有标点符号和数字的字符串,但忽略了字符串中含有特殊字母(如u变音符号)的行(Ü)不知何故通过并被发送到newfile.txt。我觉得我错过了一些明显的东西,但大量的谷歌搜索只给我返回了关于如何对特殊字母进行grep的讨论。我在https://regex101.com/测试了正则表达式,元音变音没有得到匹配,这让我觉得问题不在正则表达式上。
谢谢你能提供的任何帮助!

js81xvg6

js81xvg61#

您必须临时更改区域设置。请尝试:

LC_ALL="C" grep -E -o '^[A-Za-z]{1,}\s[A-Za-z]{1,}\s[0-9]{1,}' sourcefile.txt | sort -f > newfile.txt

在Ubuntu上对我很有效。要切换回您的区域设置,只需关闭控制台窗口。

vyswwuz2

vyswwuz22#

你不需要捏造任何LOCALE的东西

echo '<string1><space><string2><tab><number1><tab><number2><tab>...' |
gawk 'NF = 3*!/[^\0-\177]/' OFS='\n' FS='<(space|tab)>' # the demo delims

mawk 'NF = 3*!/[^\0-\177]/' OFS='\n'                    # the actual delims
<string1>
<string2>
<number1>

通过将其作为乘法来执行,它将NF设置为3(如果它是ASCII)或0(如果检测到任何多字节Unicode),从而将整行清理干净。
如果您对在使用gawk unicode模式时防止non-Unicode兼容的随机二进制字节过于迂腐,那么可以尝试

gawk 'NF = 3*/^[\0-\177]+$/'

但是如果您***坚持***只使用nawk而不是其他2个,则添加一对( )::

nawk 'NF = 3*(!/[^\0-\177]/)' OFS='\n'

以避免由其错误解析器引起的致命错误,尽管代码本身符合POSIX

相关问题