Sed не заменяет шаблон, понятный gedit - PullRequest
0 голосов
/ 04 сентября 2018

Мне нужно удалить некоторый контент, за которым следуют 5 дефисов (в отдельной строке) из 1000 файлов. В основном это выглядит так:

НЕКОТОРЫЕ СОДЕРЖАНИЕ
-----
НЕКОТОРЫЙ СОДЕРЖАНИЕ БУДЕТ УДАЛЕНО С 5 ГИФЕНАМИ ВЫШЕ

Я пытался сделать это с этим решением, но у меня оно не сработало:

  • эту команду - sed '/-----/,$ d' *.txt -i - нельзя использовать, поскольку некоторые из этих текстов имеют строки с более чем 5 дефисами;
  • эта команда - sed '/^-----$/,$ d' *.txt -i - привела к тому, что все файлы остались без изменений).

Итак, я понял, что это может быть что-то в отношении символов «^» и «$», но я честен, и я новичок в Sed и RegEx, если честно, и я не знаю, в чем проблема.

Я также обнаружил, что этот RegEx - ^-{5}$(\s|\S)*$ - хорош для захвата только тех блоков, которые начинаются точно с 5 дефисов, но ввод его в команду sed не дает эффекта (и дефисы, и текст после них остаются, где они были).

Что-то я не понимаю в sed, наверное, потому что, когда я использую приведенное выше выражение с Find & Replace , оно работает безупречно. Но я не хочу открывать, изменять и сохранять 1000 файлов вручную.

Я снова задаю этот вопрос, потому что данное решение (ссылка выше) мне не помогло.

Первая команда, которую я опубликовал (sed /-----/,$ d' *.txt -i), также привела к удалению полного содержимого некоторых файлов, например файла с 5 дефисами, новой строки с одним пробелом (и не более текста) в нижней части это:

НЕКОТОРЫЕ СОДЕРЖАНИЕ
-----
один пробел

EDIT:

Да, я забыл о ' здесь, но в Терминале я использовал эти команды с ним.

Да, эти файлы заканчиваются на \ n или \ r. Есть ли решение для этого?

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Я думаю, вы хотите это:

 sed '/^-\{5\}/,$ d' *.txt -i

Обратите внимание, что { и } нужно экранировать.

0 голосов
/ 05 сентября 2018

Вы просто пытаетесь удалить из ----- в отдельной строке (которая может заканчиваться на \ r) до конца файла? Это было бы:

awk '{print} /^-----\r?/{exit}' file

Вышеописанное будет работать с использованием всех awk во всех оболочках во всех системах UNIX.

0 голосов
/ 04 сентября 2018
$ sed  '/^-----/p;q' file
SOME CONTENT

или

$ sed -E '/^-{5}/p;q' file
SOME CONTENT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...