Sed: шаблон Замены на каждой второй новой строке?

Можно использовать find, stat, sort, и tail сделать это.

find . -exec stat --format="%X" + | sort -n | tail -n 10

Однако Вы могли бы рассмотреть использование watch и du. watch будет периодически выполнять команду (каждые 2 секунды по умолчанию). И du выставочное использование диска. Эта команда покажет Вам использование диска каждого файла и папки в текущем каталоге, и вывод будет непрерывно обновляться.

watch "du -s *"

Можно запустить в корне и видеть, какая папка увеличивает самое быстрое, затем прогрессируйте вниз иерархия папок, пока Вы не находите преступника (преступников).

Если Вы находитесь в папке, которая имеет слишком много файлов для наблюдения на экране сразу, можно ограничить его путем разделения файлов как du -s [a-h]*. Кроме того, это не покажет скрытые файлы; для этого Вам нужно .* или .[a-h]*, и т.д.

10
31.05.2019, 09:26
5 ответов

см. https://stackoverflow.com/questions/5858200/sed-replace-every-nth-occurrence

Решение использует awk, а не sed, но "используют правильный инструмент для задания". Это может или не может быть возможно сделать в sed, но, даже если это будет, то это будет намного легче в инструменте как awk или жемчуг.

6
27.01.2020, 20:00
  • 1
    Используя то, что я имею, изучают там меня девица sed -e 'n;s/2004-2009/6e législature/g' который решил мою проблему. –  Matthieu Riegler 01.08.2012, 15:27
  • 2
    , который не получит каждое второе возникновение, оно будет искать Ваш шаблон на каждой второй строке. т.е. пропустите 1-е, 3-е, 5-е, 7-е, и т.д. строки. конечно, это могло бы все еще работать на Ваш конкретный документ. –  cas 02.08.2012, 01:19
  • 3
    Да я знаю. это - то, в чем я нуждался на самом деле. –  Matthieu Riegler 02.08.2012, 03:27
sed 's/pattern/replacement/2'

Заменит второе возникновение на каждой строке, которая имеет шаблон.


если у Вас есть GNU sed:

sed '1~2N ; s/pattern/replacement/2'

Запуск со строки один 1, строка после того, как это будет добавлено к пространству шаблона N затем s команда заменит второе возникновение шаблона. затем sed спустит две строки ~2 и повторитесь.

14
27.01.2020, 20:00
  • 1
    я не хочу второе, но каждую секунду. –  Matthieu Riegler 01.08.2012, 14:45
  • 2
    у меня есть один шаблон на строку. Это не будет работать. –  Matthieu Riegler 01.08.2012, 14:53
  • 3
    были бы хороши знать что предшествующий. Таким образом, шаблон происходит на строке один, два, три и четыре (и т.д.), и Вы хотите заменить шаблон на строке два, четыре, и т.д.? –  llua 01.08.2012, 15:00
  • 4
    более короткая альтернатива может быть code(sed '1~2s/pattern/replacement /') –  jaap 22.06.2015, 17:30

Один шаблон символа в одной строке: sed's / ([^a] *) a/\1c/g'

Каждый второй шаблон (только одно соответствие шаблона на строку может появиться. если два или больше соответствия на одну строку появятся, только второй будет заменен),

echo -e "test\nreplace_me\ntest\ntest\nreplace_me\nreplace_me\nreplace_me" | \
sed '/replace_me/{:a;N;/replace_me.*replace_me/!Ta;s/replace_me/replaced/2;}'
0
27.01.2020, 20:00

Простая интерпретация:

В первой строке, содержащей хотя бы одно вхождение ШАБЛОНА, вы хотите проигнорировать его и напечатать строку как есть. Во второй строке, содержащей хотя бы одно вхождение ШАБЛОНА, вы хотите заменить первый экземпляр ШАБЛОНА на ЗАМЕНУ. В третьей строке, содержащей хотя бы одно вхождение ШАБЛОНА, вы хотите напечатать строку как есть. В четвертой строке, содержащей хотя бы одно вхождение ШАБЛОНА, вы хотите заменить первый экземпляр ШАБЛОНА на ЗАМЕНУ. И так далее. Строки, не соответствующие ШАБЛОНУ, следует печатать без изменений.

Это можно легко сделать с помощью Sed следующим образом:

sed -e '/PATTERN/ { :inside' -e 'n;s//REPLACEMENT/;t' -e 'b inside' -e '}'

Или с меньшим количеством пробелов и более короткой меткой:

sed -e '/PATTERN/{:i' -e 'n;s//REPLACEMENT/;t' -e 'b i' -e '}'

РЕДАКТИРОВАТЬ: Я просто перечитал вопрос и заметил более сложную интерпретацию:

Заменить второе вхождение ШАБЛОН во всем документе с ЗАМЕНА, независимо от того, встречается ли он в той же строке, что и первое вхождение, или нет. Оставьте первое и третье вхождения без изменений. И т.д.

Я считаю, что это также можно сделать с помощью Sed, хотя это НАМНОГО сложнее, и я считаю, что это зависит от используемого регулярного выражения. Я постараюсь что-то придумать и опубликовать, но пока я оставлю этот ответ в простой версии выше.

2
27.01.2020, 20:00

Вы были очень близки, просто пропустите первую строчку:

sed '1n;s/pattern/replacement/;n'

Почему awkдолжен быть лучшим инструментом в этом случае?

1
27.01.2020, 20:00

Теги

Похожие вопросы