Nano Hash - криптовалюты, майнинг, программирование

Perl многострочный найти и заменить

Я пытаюсь использовать простой однострочный Perl для следующего ввода:

@F7##########0/1
C4CTA6GCAAC56G67CTCA99C
+
b[[WZ56W]87X9HBB
@44FC6%%%%&&&&&&&1UP1
GTS4HY2IOMD3FCCA8DFLLLTG
+
]]^4YY23ZV\6`a8`^9^a

и т.п.

Я хотел бы, чтобы мой вывод выглядел так:

@F7##########0/1
C4CTA6GCAAC56G67CTCA99C
+F7##########0/1
b[[WZ56W]87X9HBB
@44FC6%%%%&&&&&&&1UP1
GTS4HY2IOMD3FCCA8DFLLLTG
+44FC6%%%%&&&&&&&1UP1
]]^4YY23ZV\6`a8`^9^a

и т.п.

Я хотел бы найти строку, начинающуюся с @, и сохранить (группировать) оставшуюся часть строки в $1. Затем я нахожу следующее вхождение + и добавляю $1 в конец этой строки.

Я пробовал perl -pi -e "s%^@(.*)$\1\n(.*)$\2\n(\+)$\3\n%$1\n$2\n\+$1%mg" file.txt, но после ^@(.*)$\1\n ничего не нашел.

Наверняка для этого есть работающий однострочный лайнер. Однострочники Awk, Sed или tr приветствуются, но изменения в file.txt должны быть сделаны в строке, так как file.txt большой и запись в другой файл нежелательна.

20.01.2012

Ответы:


1

К сожалению, awk не предлагает встроенных изменений, поэтому это может быть не то, что вам нужно. Но если вы это сделаете, то сработает следующее:

awk '/^@/{a=substr($0,2)}/^\+/{printf ("%s%s\n", $0,a);next}1' file > newfile

Обновление: я попытался сделать то, что вы ищете, в sed, что позволяет внести in-file изменений.

sed -i '/^@/{h};/^\+/{x;s/\(.\)\(.*\)/+\2/}' file

Объяснение:

  • /^@/{h} : мы ищем строку, которая начинается со знака @, и когда мы ее находим, мы помещаем всю строку в hold space. Sed имеет два буфера, pattern space и hold space. Pattern space — место, где происходят все действия. hold space позволяет нам временно сохранять информацию, чтобы мы могли выполнить с ней какие-либо действия позже.
  • /^\+/{x;... : когда мы находим строку, начинающуюся с +, мы выполняем над ней действие x. Это означает, что мы извлекаем информацию из нашего hold space и возвращаем ее в pattern space. Как только мы это сделали, мы делаем простую замену.
  • ...s/\(.\)\(.*\)/+\2/ : это означает, что мы идентифицируем символы, используя grouping. Поскольку перед нашей частью текста стояло @, чего вы не хотели, мы изолируем этот символ, используя ., что означает любой символ. Мы также помещаем все остальное из этой строки во вторую группу. Эти группы необходимо экранировать {чтобы вы видели \(\) вместо просто ()}. В разделе замены вставляем + и вторую группу. Помните, что в первой захваченной группе было только @. Нам просто нужна вторая группа, поэтому мы ссылаемся на нее, используя \2 (обратная косая черта и номер группы, на которую вы хотите сослаться).

Тест для awk:

[jaypal:~/Temp] cat file
@F7##########0/1
C4CTA6GCAAC56G67CTCA99C
+
b[[WZ56W]87X9HBB
@44FC6%%%%&&&&&&&1UP1
GTS4HY2IOMD3FCCA8DFLLLTG
+
]]^4YY23ZV\6`a8`^9^a

[jaypal:~/Temp] awk '/^@/{a=substr($0,2)}/^\+/{printf ("%s%s\n", $0,a);next}1' file
@F7##########0/1
C4CTA6GCAAC56G67CTCA99C
+F7##########0/1
b[[WZ56W]87X9HBB
@44FC6%%%%&&&&&&&1UP1
GTS4HY2IOMD3FCCA8DFLLLTG
+44FC6%%%%&&&&&&&1UP1
]]^4YY23ZV\6`a8`^9^a

Тест для sed:

Вы можете использовать опцию -i для внесения изменений на месте. Нижеследующее предназначено только для демонстрации, чтобы вы могли увидеть результат.

[jaypal:~/Temp] sed '/^@/{h};/^\+/{x;s/\(.\)\(.*\)/+\2/}' file
@F7##########0/1
C4CTA6GCAAC56G67CTCA99C
+F7##########0/1
b[[WZ56W]87X9HBB
@44FC6%%%%&&&&&&&1UP1
GTS4HY2IOMD3FCCA8DFLLLTG
+44FC6%%%%&&&&&&&1UP1
]]^4YY23ZV\6`a8`^9^a
20.01.2012
  • Эта строка sed — это именно то, что я искал изначально, когда пытался использовать sed. Однако я отказался от sed, когда не смог сопоставить или заменить \n. Это похоже на сложное регулярное выражение, не могли бы вы объяснить это для меня? 20.01.2012
  • Это действительно здорово! Объяснение + тоже. Спасибо! 20.01.2012
  • Отличная работа. В решении sed /^\+/ меня на мгновение бросило, так как без переключателя -r + не является особенным и обычно его не нужно экранировать. Однако, если он экранирован, это означает 1 or more of the preceeding character or subexpression, но в извращенной логике, поскольку ^ является маркером места, а не символом, он возвращается к символу +. 20.01.2012

  • 2

    Мои извенения. Я прочитал ваш вопрос более внимательно и вижу, что вы хотите обработать свой файл построчно. Этот однострочный достигнет этого

    perl -pe "$dat = $1 if /^\@(.+)/; s/^\+/+$dat/;" infile
    
    20.01.2012

    3

    Программа ниже делает то, что вам нужно

    use strict;
    use warnings;
    
    my $str = <<'STR';
    @F7##########0/1
    C4CTA6GCAAC56G67CTCA99C
    +
    b[[WZ56W]87X9HBB
    @44FC6%%%%&&&&&&&1UP1
    GTS4HY2IOMD3FCCA8DFLLLTG
    +
    ]]^4YY23ZV\6`a8`^9^a
    STR
    
    $str =~ s/^@(.+?)$(.+?)^\+/\@$1$2+$1/gms;
    
    print $str;
    

    ВЫВОД

    @F7##########0/1
    C4CTA6GCAAC56G67CTCA99C
    +F7##########0/1
    b[[WZ56W]87X9HBB
    @44FC6%%%%&&&&&&&1UP1
    GTS4HY2IOMD3FCCA8DFLLLTG
    +44FC6%%%%&&&&&&&1UP1
    ]]^4YY23ZV\6`a8`^9^a
    
    20.01.2012

    4

    Это может сработать для вас:

    sed '/^@/h;/^+/{G;s/\n@//}' file
    @F7##########0/1
    C4CTA6GCAAC56G67CTCA99C
    +F7##########0/1
    b[[WZ56W]87X9HBB
    @44FC6%%%%&&&&&&&1UP1
    GTS4HY2IOMD3FCCA8DFLLLTG
    +44FC6%%%%&&&&&&&1UP1
    ]]^4YY23ZV\6`a8`^9^a
    
    20.01.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..