Я пробовал следующий оператор SED (sedex1) в seddy.dev:
sed '/^$/d ; s/^[ \t]*// ; s/[ \t]*$// ; /::/N ; s/::/: / ; s/\n//'
и результат, который я получаю, различается в зависимости от того, делаю ли я это в одной команде SED или разбиваю ее и использую две: первую половину для удаления пустых строк и лишних пробелов, вторую половину для объединения строк с небольшими заменами, чтобы получить желаемый конечный результат.
Моя конечная цель — использовать это в Applescript в macOS. Нашей команде приходится обрабатывать подобный текст много раз в день (из форм регистрации клиентов), и нам нужен быстрый и безболезненный способ сделать это. мы думаем о pbcopy и pbpaste, но, очевидно, мы доберемся до этого, как только возьмем под контроль SED.
Использование этой команды SED (sedex1) для этого входного текста (in1):
thingOne::
some text for thingOne
thingTwo::
some text for thingTwo
thingThree::
some text for thingThree
thingFour::
some text for thingFour
Я получаю этот выходной текст (out1):
thingOne: some text for thingOne
thingTwo: some text for thingTwo
thingThree:
some text for thingThree
thingFour:
some text for thingFour
но я пытаюсь получить этот вывод (wantedText):
thingOne: some text for thingOne
thingTwo: some text for thingTwo
thingThree: some text for thingThree
thingFour: some text for thingFour
Если я использую те же шаблоны SED, но в два этапа, все будет вести себя так, как ожидалось. в частности, запустив это (sedex2):
sed '/^$/d ; s/^[ \t]*// ; s/[ \t]*$//'
на in1 производит этот вывод (out2):
thingOne::
some text for thingOne
thingTwo::
some text for thingTwo
thingThree::
some text for thingThree
thingFour::
some text for thingFour
а затем, используя это (out2) в качестве входных данных, эта команда SED (sedex3) делает все остальное:
sed '/::/N ; s/::/: / ; s/\n//'
получение желаемого конечного результата (wantedText).
Что я не понимаю и/или упускаю из sedex1, что он не дает желаемого результата (wantedText), когда те же самые шаблоны, используемые последовательно в sedex2, а затем в sedex3, действительно создают WantText?





sed '/^$/d; s/^[ \t]*//; s/[ \t]*$//'
sed '/::/N; s/::/: /; s/\n//'
sed '/^$/d; s/^[ \t]*//; s/[ \t]*$//; /::/N; s/::/: /; s/\n[ \t]*/ /'
/^$/d;: Удалить пустые строки.s/^[ \t]*//;: удалите ведущие пробелы из каждой строки.s/[ \t]*$//;: удалите конечные пробелы из каждой строки./::/N;: добавить следующую строку к текущей, если текущая строка содержит ::.s/::/: /;: Замените :: на :.s/\n[ \t]*/ /: замените новую строку и все последующие пробелы одним пробелом.Это может сработать для вас (GNU sed):
sed ':a;/::\s*/{x;s//: /p;x;h;d};/\S/H;$!d;g;ba' file
Каждый раз, когда мы видим строку, содержащую ::, мы хотим обработать накопленные строки, распечатать результат и начать накапливать больше строк.
Строки накопления помещаются в пространство удержания, заголовок этих строк будет содержать ::, а последующие непустые строки добавляются.
В конце файла последние накопленные строки заменяют текущую строку в пространстве шаблонов, а переход гарантирует, что последние накопленные строки обрабатываются как обычно.
Эзотерическое улучшение вышеуказанного решения:
sed '/::\s*/{x;s//: /p;x;h;d};/\S/H;$!d;G;D' file
Альтернативное непрозрачное решение:
sed '/\n/!{/\S/H;$!d;x;D};s/::\s*/: /;P;D' file
Да, действительно! Это отлично справляется со своей задачей, большое спасибо.
Конечно, разбор этого — моя следующая задача, и я открыто признаю, что это выглядит немного устрашающе. Но эй, вот как мы узнаем такие счастливые дни! :)
@tfloatcp0 простой способ проанализировать sed — использовать опцию отладки --d и изучить выходные данные.
сделаю, спасибо.
спасибо за ваш ответ @YassineLbk, но результаты, которые я получаю с помощью вашей команды, не показывают желаемого результата. Я протестировал предложенную вами команду на seddy.dev и sed.js.org и получил тот же результат, что и в исходной формулировке задачи, а именно out1. я что-то упускаю?