Удалите принудительные разрывы строк из вывода fortune, сохранив их для строки автора.

Это - желаемое поведение GNU grep версии 2.24 (выпущено 10 марта 2016 г.) и выше, и это исправление ошибки, появившейся в GNU grep 2.5.

Изучение исходного кода :

if (*p == '$' || (*p == '^' && !after_unescaped_left_bracket))
  die (EXIT_TROUBLE, 0,
       _("unescaped ^ or $ not supported with -Pz"));

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


Хотя это выбор GNU grep, это ошибка, поскольку GNU grep компилирует регулярное выражение PCRE с PCRE_MULTILINE , установленным , а также вернулся к вызову pcre_exec для более чем одной записи. в то время , что является источником проблемы, как указано Стефаном Шазеласом

2
12.02.2016, 21:18
3 ответа
echo $(fortune) | sed 's/-- /\n    -- /'

Вставьте любое количество начальных пробелов перед строкой автора. Это просто использует echo для удаления символов возврата каретки, а затем заменяет префикс автора новой строкой и префиксом автора.

2
27.01.2020, 22:11

Это в основном украдено из здесь :

fortune | sed ':a;N;$!ba;s/\n[[:space:]]\{2\}--/ --/'

Из исходного ответа:

Пояснение:

  1. Создайте ярлык через : a .
  2. Добавить текущую и следующую строку в пространство шаблонов через N .
  3. Если мы находимся перед последней строкой, перейдите к созданной метке $! Ba ( $! означает не делать этого в последней строке, так как должен быть один последний символ новой строки ).

Последний шаг - единственный, который я изменил. Поскольку шаблон представляет собой две сцепленные строки, ищите - , которым предшествуют два или более пробелов и новая строка (AFAIK этот шаблон отображается только в кавычках). Замените новую строку одним пробелом и добавьте обратно в - , который был удален.

До:

There is always one thing to remember: writers are always selling somebody out.    
            -- Joan Didion, "Slouching Towards Bethlehem"

После:

There is always one thing to remember: writers are always selling somebody out. -- Joan Didion, "Slouching Towards Bethlehem"
0
27.01.2020, 22:11

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

bash-4.1$ cat input 
duck
duck
duck
  -- goose
bash-4.1$ perl -0777 -ple 's/\n(?=[^\n]+\n[^\n]+\n)/ /g' input
duck duck duck
  -- goose
bash-4.1$ 

Другим решением было бы объединить строки в массив строк в памяти, а затем объединить этот массив с пробелами, за исключением последней строки, или подсчитать количество строк вначале, а затем с помощью этого числа определить, когда новую строку следует преобразовать в пробел или оставить в покое.

0
27.01.2020, 22:11

Теги

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