Вы пытаетесь сделать замену шестнадцатеричной строки \x0D\x0A
, которая является не чем иным, как CRLF
или \r\n
.
Поскольку awk по умолчанию разделяет свои записи насимвол (то есть LF
), вам на самом деле никогда не придется пытаться сопоставить свой символ \n
(или \x0a
).Поэтому все, что вам нужно сделать, это заменить \r
на ,\r
(0x2c
- это шестнадцатеричное значение ,
).Так что это должно сработать:
awk '(NR>1){sub("\r$",",\r"); print}' file
Так почему же ваш скрипт не работает?
Как упоминалось ранее, awk работает в записях иразделителем записей по умолчанию является символ .Это означает, что символ , также записанный как \n
и имеющий шестнадцатеричное значение \x0a
, никогда не является частью записи $0
.Кроме того, оператор печати автоматически добавляет свой разделитель вывода записи ORS
после записи.По умолчанию это снова символ .Таким образом, вам не нужно было пытаться заменить это.Все, что вам нужно было сделать:
awk 'NR > 1 {sub(/\x0D$/,"\x2C\x0D"); print}' test.csv > testfixed.csv
Так можно ли заменить его шестнадцатеричными значениями?
Да, ясно, что это так!
echo -n "Hello World" | awk 'sub(/\x57\x6f\x72\x6c\x64/,"\x43\x6f\x77")'
Но как я могу изменить ?
Вы можете просто переопределить разделитель выходной записи ORS
:
awk -v ORS="whatever" '1'
Также,используя GNU awk, вы можете следовать решению Гленна Джекмана .
Очень связано: Почему вывод моего инструмента перезаписывается и как его исправить?