LINUX.ORG.RU

Удалить символ в предыдущей строке

 


0

1

Здравствуйте.
После чистки файла дампа остались лишние запятые в конце строки, после которой следует закрывающая скобка. Например:

`data` varchar(128) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Пытался удалить их sed'ом:
sed -i 's/,\n)/\n)/g)' file.sql
или
sed -i 's/,)/)/g)' file.sql
Ничего не получилось.
Прошу помочь. Строка, перед которой нужно удалить запятую всегда начинается с ") ENGINE=".



Последнее исправление: Neuro75 (всего исправлений: 1)

По мотивам

https://stackoverflow.com/questions/1251999/how-can-i-replace-a-newline-n-usi...

$ cat 4sed.txt 
`data` varchar(128) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
`data` varchar(128) NOT NULL,
NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
`data` varchar(128) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
`data` varchar(128) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
$ sed ':a;N;$!ba;s/,\n)/\n)/g' 4sed.txt 
`data` varchar(128) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
`data` varchar(128) NOT NULL,
NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
`data` varchar(128) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
`data` varchar(128) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
justAmoment ★★★★★
()
Ответ на: комментарий от crutch_master

В sql-дампе конструкции:
sed ':a;N;$!ba;s/,\n)/\n)/g'
и
sed 's/\n/===n===/g'
почему-то не срабатывают. После отработки и первой и второй файл - без изменений
Возможно конец строки в них не \n а как-то по-другому обозначается?

Neuro75
() автор топика
Ответ на: комментарий от Neuro75

Дополнение:
В конце строки не \n (замена \n на что-либо в sed не срабатывает, файл без изменений), не \r\n (аналогично).
Замена \r на что-либо (напр. ==r==) срабатывает, но строки все равно разделены:
CREATE TABLE `all_art` (==r==
`sup_id` bigint(20) NOT NULL,==r==
`data` varchar(128) NOT NULL,==r==
) ENGINE=InnoDB DEFAULT CHARSET=utf8;==r==
Соответственно, применить указанные выше методы не получается.
Что может стоять в качестве признака конца строки помимо \r?

Neuro75
() автор топика
Ответ на: комментарий от Neuro75

Там по-моему $. Делай perl -pe "s/\n/===n===/g"; Этот sed упоротый какой-то, постоянно мозг имеет.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)

Простейшее решение на AWK:

{
    LINES[NR] = $0
}

/^\) ENGINE=/ {
    sub(",$", "", LINES[NR-1])
}

END {
    for (i = 1; i <= NR; i++) print LINES[i]
}

Можно положить его в файл my.awk и использовать следующим образом:

$ awk -f my.awk file.sql 

Или намутить уродский однострочник:

$ awk '{L[NR]=$0} /^\) ENGINE=/{sub(",$","",L[NR-1])} END{for(i=1;i<=NR;i++)print L[i]}' file.sql

evbogdanov
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.