У меня есть такой файл csv:

0;test1;description;toto
1;test2;description;tata
2;test3;desc
ription;tutu
3;test4;description;tete

В оболочке я хотел бы заменить все строки, которые не начинаются с числа. В этом примере я хочу заменить \ nription на ription

Я не нахожу правильного выражения с помощью sed, grep ... :(

Я хочу такой результат:

0;test1;description;toto
1;test2;description;tata
2;test3;description;tutu
3;test4;description;tete

Большое спасибо

РЕДАКТИРОВАТЬ 1: Я пробовал что-то вроде этого:

LC_ALL=C tr '(\n)[0-9]' ' ' < hotels.csv > test.csv

Или это :

sed ':a;N;$!ba;s/\r\n?![0-ç-9]/ /g' hotels.csv 

Но я думаю, что мое регулярное выражение неверно, и оно не работает :(

2
JHERRERA 24 Фев 2016 в 14:37

4 ответа

Лучший ответ

С awk это кажется возможным:

awk -F ';' '{if (NR>1  && match($1,/^[0-9]+$/)) printf("\n"); printf("%s",$0);} END{printf("\n")}' infile.csv

Что оно делает:

  • из второй строки: проверьте, является ли первое поле числом, и распечатайте новую строку
  • в любой строке: вывести всю строку ($0) без конца новой строки

Выходные данные отправляются в STDOUT, входные данные поступают из infile.csv

РЕДАКТИРОВАТЬ: Извините, я пропустил копирование совпадения (...)

1
WeSee 24 Фев 2016 в 13:15

Использование grep -P

grep -P "^\d" file.csv 

Используйте команду grep для сопоставления строк, начинающихся с цифры.

0
slugo 24 Фев 2016 в 12:59

Из-за особенностей обработки пространства паттернов sed вам придется использовать что-то вроде этого ..

Примечание: ~ должен быть символом, отсутствующим в вашем тексте.

$cat file
0;test1;description;toto
1;test2;description;tata
2;test3;desc
ription;tutu
3;test4;description;tete
$ sed 'N;s/\n/~/' file | sed -r 's/~([0-9])/\n\1/g;s/~//g'
0;test1;description;toto
1;test2;description;tata
2;test3;description;tutu
3;test4;description;tete

PS: если ваш входной файл имеет окончания строки Windows, вам придется использовать \r\n вместо \n

0
riteshtch 24 Фев 2016 в 13:29
awk '{sub(/3;desc/,"3;description;tutu")}NR == 4 {next}1' file
0;test1;description;toto
1;test2;description;tata
2;test3;description;tutu
3;test4;description;tete
0
Claes Wikner 27 Фев 2016 в 00:04