Различные результаты awk для Linux и mingw64 с окончаниями строк CRLF - PullRequest
1 голос
/ 08 марта 2019

В Linux:

echo -n $'boo\r\nboo\r\n' | awk $'BEGIN { RS="\\n" } {gsub("boo","foo"); print}' | cat -v

возвращает ожидаемое

foo^M
foo^M

Однако в mingw64 (git bash для windows) та же команда возвращает:

foo
foo

без возвратов каретки.

Я попытался установить разделитель записей явно, поскольку, возможно, значение по умолчанию было различным для двух платформ, но awk на mingw64 все еще проверяет возврат каретки.Как я могу заставить awk делать то же самое в Linux на mingw64?Обратите внимание, что версии awk немного отличаются (GNU Awk 4.0.2 в Linux и GNU Awk 4.2.1 в mingw64), но я не ожидаю, что это будет иметь значение, если не будет какой-либо ошибки.

Обратите внимание, чточто-то происходит конкретно в awk, поскольку на mingw64 это:

echo -n $'boo\r\nboo\r\n' | cat -v

возвращает ожидаемое:

boo^M
boo^M

1 Ответ

1 голос
/ 08 марта 2019

После поиска я нашел этот вопрос , а из этот ответ :

это что-то сделано библиотеками C и остановило егоВ этом случае вы должны установить переменную awk BINMODE на 3

Я изменил ваш код на:

echo -n $'boo\r\nboo\r\n' | awk -v BINMODE=3 $'BEGIN { RS="\\n" } {gsub("boo","foo"); print}' | cat -v

И попробовал это на Unix, Linux, MacOS и Windows, все выдают этовывод:

foo^M
foo^M

Итак, -v BINMODE=3 - это то, что вы ищете.
ПРИМЕЧАНИЕ , что только -v BINMODE=3 этот переключатель и до того, как код работает.
Обычно мыможет передать переменную в awk с помощью переключателя -v, в блоке BEGIN, или установить его после кода перед файлами,
, но в этом случае я попробовал три способа, только -v BINMODE=3 работает.
Угадайте, что-тоделать с процессом компиляции awk.

Пример (под cygwin в Windows):

$ echo -n $'boo\r\nboo\r\n' | awk -v BINMODE=3 '1' | cat -v    
boo^M                                                          
boo^M                                                          

$ echo -n $'boo\r\nboo\r\n' | awk 'BEGIN{BINMODE=3}1' | cat -v 
boo                                                            
boo                                                            

$ echo -n $'boo\r\nboo\r\n' | awk '1' BINMODE=3 | cat -v       
boo                                                            
boo                  

Под другими упомянутыми платформами все они выдают:

boo^M
boo^M
...