grep для x20-x7E регулярных выражений в шестнадцатеричном диапазоне не работает в Windows10 MINGW64 bash - PullRequest
1 голос
/ 26 апреля 2020

Мой файл test.csv

Col1,Col2,Col3,Col4
1,AAA,1,
2,BBB,0,
3,CCCÆ,,ttt
4,DDD,1,
5,EEE,0,

Ожидаемый вывод:

3,CCCÆ,,ttt

Пробовал:

grep -a "[^\x20-\x7e]+" test.csv
grep -a '[^\x20-\x7e]+' test.csv
grep "[^\x20-\x7e]+" test.csv
grep '[^\x20-\x7e]+' test.csv

также пробовал флаги -P и -E, но все не возвращают мне результат, которого я хочу. В Powershell я сделал

Select-String -Pattern '[^\x20-\x7E]+' test.csv

, и он дал мне ожидаемый результат.

Может ли кто-нибудь указать мне правильное направление для MINGW64 bash grep (GNU grep) 3.1 на Windows10? Он устанавливается через git для загрузки windows здесь: https://git-scm.com/download/win

Ответы [ 2 ]

2 голосов
/ 26 апреля 2020

Похоже, синтаксис PREIX BRE и ERE в grep для Windows не поддерживает запись \xXX.

Вы можете использовать опцию -P, чтобы включить механизм регулярных выражений PCRE, а затем использовать

grep -P "[^\x{00}-\x{7E}]" file

Или

grep -P "[^[:ascii:]]" file

, чтобы найти любую строку, содержащую не-ASCII символ.

ПРИМЕЧАНИЕ , что вы не можете использовать диапазон [^\x20-\x7E], потому что CR (часть строки, заканчивающаяся в Windows текстовых файлах) будет соответствовать, и все строки, кроме последней (если это не сопровождается разрывом (-ями) задней линии. Вы можете добавить символ CR в класс отрицанных символов и использовать grep -P "[^\x{0D}\x{20}-\x{7E}]" file.

0 голосов
/ 26 апреля 2020

Если вы можете использовать напрямую perl, это будет делать:

perl -ne  'print if (/[^\x00-\x7F]/)' test.csv
...