Необходимо заменить \ x0d \ x0a на \ x2c \ x0d \ x0a в файле - PullRequest
0 голосов
/ 23 октября 2018

Мне нужно заменить \x0d\x0a на \x2c\x0d\x0a в файле

Следующее ничего не делает:

awk '{if NR> 1 {gsub(/\x0D\x0A/,"\x2C\x0D\x0A"); print}}' test.csv > testfixed.csv
$ xxd test.csv
00000e0: 350d 0a45 4941 2d39 3330 2c44 6169 6c79  5..EIA-930,Daily
00000f0: 2c4e 5949 532c 2c55 5443 302c 3030 3132  ,NYIS,,UTC0,0012

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Новая строка \n или \x0A не будет появляться в каждой записи, потому что по умолчанию это разделитель записей.

Я бы сделал это: определите input и output разделители записей должны быть \r\n, а затем для номера строки> 1 добавить к записи запятую:

$ printf "a\r\nb\r\nc\r\n" >| file

$ hexdump -C file
00000000  61 0d 0a 62 0d 0a 63 0d  0a                       |a..b..c..|
00000009

$ awk 'BEGIN {RS = ORS = "\r\n"} NR > 1 {$0 = $0 ","} 1' file | hexdump -C
00000000  61 0d 0a 62 2c 0d 0a 63  2c 0d 0a                 |a..b,..c,..|
0000000b
0 голосов
/ 23 октября 2018

Вы пытаетесь сделать замену шестнадцатеричной строки \x0D\x0A, которая является не чем иным, как CRLF или \r\n.

Поскольку по умолчанию разделяет свои записи насимвол (то есть LF), вам на самом деле никогда не придется пытаться сопоставить свой символ \n (или \x0a).Поэтому все, что вам нужно сделать, это заменить \r на ,\r (0x2c - это шестнадцатеричное значение ,).Так что это должно сработать:

awk '(NR>1){sub("\r$",",\r"); print}' file

Так почему же ваш скрипт не работает?

Как упоминалось ранее, работает в записях иразделителем записей по умолчанию является символ .Это означает, что символ , также записанный как \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, вы можете следовать решению Гленна Джекмана .


Очень связано: Почему вывод моего инструмента перезаписывается и как его исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...