LINUX.ORG.RU

Вопрос по регулярному выражению

 , ,


0

0

В текстовом файле есть две идентичные строки, каждая начинается с новой строки, одна строка с точкой на конце, вторая без точки.

Нужно удалить строку с точкой в конце.

Целый день ломал голову, как сделать это через sed, возможно есть другие варианты ?

Подскажите, пожалуйста.



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

sed '/^string\.$/d'
anonymous
()
Ответ на: комментарий от nerve

Суть в том, что в реальном примере - таких строк больше тысячи. Каждые две идентичны друг другу и одна из них с точкой, следующая пара снова повторяется и идентичны только себе, но опять одна строка из пары с точкой и т.д.

Как быть в этом случае ?

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

Хреновый из тебя ПМ - не умеешь чётко ставить задачу.

Скорее всего, задача должна звучать приблизительно так: «Удалить из файла все строки с точкой в конце при условии, что в этом же файле есть такая же строка без тоски в конце».

Варианты правильных ответов:

1) man shell, man grep, man sed

2) man awk

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

Я чётко поставил задачу. Есть текстовый файл, в нём 1553 строк, которые начинаются с новой строки.

Каждая пара идентична друг другу, но одна строка из пары - с точкой. И так далее, по той же схеме.

У вас нет верного решения ? Маны мне не помогут, я перебираю это всё с 9 утра

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

Маны мне не помогут, я перебираю это всё с 9 утра

Найми специалиста.

anonymous
()
grep '\.$' < myfile |
sed 's/\.$//'>dotlines
grep -F -v -x -f dotlines < myfile > result

Можно ещё на awk сохранять строки в массив и фильтровать.

legolegs ★★★★★
()
Ответ на: комментарий от anonymous

Лишний, но я плохо знаю sed. Промежуточный файл можно заменить на <() но затруднится отладка.

legolegs ★★★★★
()
Ответ на: комментарий от gamble

Ниже еще короче.

Просто удаляет все строки с точкой в конце.

anonymous
()
Ответ на: комментарий от legolegs

Гениальность решения как в раз в том, что удаления строк с точкой на конце достаточно, если всё ровно так, как описывает топикстартер.

А в том, что там могут быть и строки не следующие в «парах» - в общем-то никто не виноват, кроме самого вопрошающего. Если решать задачу «в лоб» по принципу «за что купил» (оно же «наот*бись») - то решение с удалением однозначно верное.

DRVTiny ★★★★★
()

Мне почему-то кажется, что это правильнее простого удаления...

echo -e '123\n123.\n678\n947.\n456\n456.\n789\n789.' | sed -nr 'N; s/^(.+)\n\1./\1/; p'
123
678
947.
456
789
DRVTiny ★★★★★
()
Ответ на: комментарий от gamble

Я чётко поставил задачу. Есть текстовый файл, в нём 1553 строк, которые начинаются с новой строки.
Каждая пара идентична друг другу, но одна строка из пары - с точкой. И так далее, по той же схеме.

Если они парные, то почему их нечётное количество?

Stil ★★★★★
()
Ответ на: комментарий от DRVTiny

echo -e '123\n123.\n678\n947.\n456\n456.\n789\n789.' | sed -nr 'N; s/^(.+)\n\1./\1/; p'

Маленький баг:

echo -e '123\n123.\n678\n947.\n456\n456.\n789\n789'a | sed -nr 'N; s/^(.+)\n\1./\1/; p'
123
678
947.
456
789
Заодно, вариант для того, чтобы не убирало строки из одной точки и следующей из двух:
echo -e '123\n123.\n678\n947.\n456\n456.\n789\n789a\n.\n..' | sed -nr 'N; s/^(.*[^.])\n\1\./\1/; p'
123
678
947.
456
789
789a
.
..

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