The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
sed теряет кавычки и не хочет  работать, !*! Аноним, 30-Дек-20, 10:37  [смотреть все]
Здравствуйте, подскажите, спасибо. GNU sed только -- остальные исполнение не поддерживают, по-моему. Типичное применение это скормить совпадения date.

echo 'value1="111" value2="222.ext" value3="333" otherdata' | sed -e 's/\(.*\)"\(.*\)\(\.ext\)"\(.*\)/echo 1:"\1" 2:"\2" 3:"\3" 4:"\4"/e'

Нас интересует value2 и им мы будем оперировать, необходимо чтобы остальные сроки были переданы в скрипт без подобных модификаций навроде исчезающего содержимого. А то всё в кашу превращается.

  • sed теряет кавычки и не хочет  работать, !*! Аноним, 11:17 , 30-Дек-20 (1)
    Я перебрал наверное все известные мне варианты экранирования кавычек (и нашёл в поисковой системе некоторые странные). Ничего не получается.
  • sed теряет кавычки и не хочет  работать, !*! Аноним, 12:14 , 30-Дек-20 (2)
    > Нас интересует value2 и им мы будем оперировать
    > А то всё в кашу превращается.

    чего получиться-то должно? Или мы по каше должны догадаться?
    предположу, что где-то должно быть

    \([^"]*\)

    • sed теряет кавычки и не хочет  работать, !*! Аноним, 12:27 , 30-Дек-20 (3)
      Никакой каши. Должна получится исходная строка (.* включает все символы) и только совпадение имени с разрешённым расширением теряет кавычки и передаётся отдельно, скрипт потом возвращает искомое закавыченное значение и все остальные данные (.*), однако эти данные при этом теряют все кавычки ещё на этапе исполнения шелла в sed и не попадают в скрипт.
    • sed теряет кавычки и не хочет  работать, !*! Аноним, 12:33 , 30-Дек-20 (4)
      Теряется именно в процессе исполнения что можно пронаблюдать отключив его:

      echo 'value1="111" value2="222.ext" value3="333" otherdata' | sed -e 's/\(.*\)"\(.*\)\(\.ext\)"\(.*\)/1:"\1" 2:"\2" 3:"\3" 4:"\4"/'

  • sed теряет кавычки и не хочет  работать, !*! ACCA, 12:34 , 30-Дек-20 (5)
    Господа студиозусы, вы слегка достали. Уже третий раз за месяц один и тот же вопрос.

    У тебя стандартная задача разобрать хэш { key=value }. Ну так и разбирай его с помощью правильного инструмента. Исходный поток [чем-нибудь] преобразуешь в правильный JSON, потом разбираешь JSON:

    echo '{ "value1"="111", "value2"="222.ext", "value3"="333" }' | tr = : | jq .value2

    Надеюсь, ты догадаешься, как добавить недостающие запятые и кавычки, где нужно.


    • sed теряет кавычки и не хочет  работать, !*! bagas, 12:38 , 30-Дек-20 (6)
      > Господа студиозусы, вы слегка достали. Уже третий раз за месяц один и
      > тот же вопрос.
      > У тебя стандартная задача разобрать хэш { key=value }. Ну так и
      > разбирай его с помощью правильного инструмента. Исходный поток [чем-нибудь] преобразуешь
      > в правильный JSON, потом разбираешь JSON:
      > echo '{ "value1"="111", "value2"="222.ext", "value3"="333" }' | tr = : | jq
      > .value2
      > Надеюсь, ты догадаешься, как добавить недостающие запятые и кавычки, где нужно.

      Не совсем понятно условие.
      А если так?
      echo 'value1="111" value2="222.ext" value3="333" otherdata' | sed 's/value2\=\"[0-9]*\.[a-zA-Z]*\"//'

      Уберем из вывода value2="222.ext.

    • sed теряет кавычки и не хочет  работать, !*! Аноним, 12:44 , 30-Дек-20 (8)
      Нет, нужен sed. Необходимо вычленить все строки с файлами, проверить чтобы эти файлы были разрешёнными, потом передать все совпавшие строки в скрипт в котором проверяется существование файла на диске и его данные такие как новое имя (и расширение), и пометить некорректные данные. С этим справляются элементарное регулярное выражение и сед. "Умники" с tr несколько раздражают. Задача максимально чётко описана. Подскажите как решить проболему, или проходите мимо. Спасибо.
      • sed теряет кавычки и не хочет  работать, !*! ACCA, 12:54 , 30-Дек-20 (9)
        Ну, некоторые мышки плакали, кололись, но продолжали жрать кактус. Похвальная целеустремлённость. Эту бы энергию, да в мирных целях.

        Я ещё раз повторю основной тезис - новый велосипед с квадратными колёсами возможен. Но не нужен. Слегка преобразуй входной поток и будет тебе счастье.

        Ты хочешь заняться онанизмом вприсядку с помощью sed или решить конкретную задачу?

        • sed теряет кавычки и не хочет  работать, !*! Аноним, 12:59 , 30-Дек-20 (10)
          Да ну какой входной поток? На входе файлы со скриптами, там любые данные в строках и их не нужно изменять как-либо. А вот данные (и файлы) к которым скрипты обращаются, можно и нужно обработать, найти потерянные на диске данные и пометить вовсе отсутствующие.
          • sed теряет кавычки и не хочет  работать, !*! ACCA, 13:17 , 30-Дек-20 (11)
            Не путай тёплое с мягким.

            На входе не файлы, а имена файлов. И это поток, в котором не любые данные, а форматированные строки. Оформи их, как правильные строки в терминах JSON, это не настолько сложно.

            Хватит тупить, перечитай всё с самого начала и проговори вслух, что именно ты делаешь.


            • sed теряет кавычки и не хочет  работать, !*! Аноним, 13:24 , 30-Дек-20 (12)
              Форматирование там совершенно случайное и оно меня никак не интересует, это забота препроцессоров и компиляторов его потом разбирать. Меня интересуют только та часть, где происходит обращение к данным. Я могу эту часть проанализировать таким же однострочником и произвести замены в совпавших строках при необходимости. Просто признай неправоту и уходи, не надо хамить.
  • sed теряет кавычки и не хочет  работать, !*! bagas, 15:29 , 30-Дек-20 (13)
    > Здравствуйте, подскажите, спасибо. GNU sed только -- остальные исполнение не поддерживают,
    > по-моему. Типичное применение это скормить совпадения date.
    >
    echo 'value1="111" value2="222.ext" value3="333" otherdata' | sed -e 's/\(.*\)"\(.*\)\(\.ext\)"\(.*\)/echo 
    > 1:"\1" 2:"\2" 3:"\3" 4:"\4"/e'

    > Нас интересует value2 и им мы будем оперировать, необходимо чтобы остальные сроки
    > были переданы в скрипт без подобных модификаций навроде исчезающего содержимого. А
    > то всё в кашу превращается.

    Вам данные (value2="") с содержимым в двойных кавычках нужно убрать, остальное оставить?

    • sed теряет кавычки и не хочет  работать, !*! Аноним, 15:46 , 30-Дек-20 (14)
      Данные (222.ext) нужно извлечь и обработать, но я так понимаю в sed нет условных операторов и поэтому используется шелл-однострочник, в который эта строка 222.ext и передаётся. Все остальные элементы строки должны оставаться без изменения. Дополнительным препятствием является то, что там будет разнообразные спецсимволы, которые совершенно нельзя трогать.

      В текущем виде мы получаем строку до совпадения, имя файла (222), расширение (ext, но в оригинале там более интересная конструкция), и всё после совпадения, после чего скрипт возвращает нам корректную строку собранную обратно на основании этих 4 элементов. Содержимое до и после 222.ext вообще не интересно и должно остаться исходным. может быть что-то по типу echo -n "\1\""; /script.sh \2 \3; echo -n "\"\4"/e также даст нужный результат, но я просто возвращаю готовую строку.

      Проблема заключается в том, что /e съедает все кавычки из строки.

      • sed теряет кавычки и не хочет  работать, !*! bagas, 15:53 , 30-Дек-20 (15)
        >[оверквотинг удален]
        > Дополнительным препятствием является то, что там будет разнообразные спецсимволы, которые
        > совершенно нельзя трогать.
        > В текущем виде мы получаем строку до совпадения, имя файла (222), расширение
        > (ext, но в оригинале там более интересная конструкция), и всё после
        > совпадения, после чего скрипт возвращает нам корректную строку собранную обратно на
        > основании этих 4 элементов. Содержимое до и после 222.ext вообще не
        > интересно и должно остаться исходным. может быть что-то по типу echo
        > -n "\1\""; /script.sh \2 \3; echo -n "\"\4"/e также даст нужный
        > результат, но я просто возвращаю готовую строку.
        > Проблема заключается в том, что /e съедает все кавычки из строки.

        Все равно не понял.
        Что значит извлечь и обработать в вашем понимании?
        Вам просто нужно спарсить значение в ковычках у значения value2?

        • sed теряет кавычки и не хочет  работать, !*! Аноним, 16:09 , 30-Дек-20 (16)
          Получить из строки и заменить на другое (при необходимости). Задача модифицировать данные или оставить их в исходном виде уже решена отдельно, нам нужно только для каждой совпавшей строки передать 2 значения (текстовую ссылку на файл и совпавшее расширение файла) из неё в скрипт, после чего заменить всю строку на вывод скрипта.

          Для всего этого используется модификатор e, но, как можно видеть из примера, кавычки исчезают в процессе, а значит скрипту уже с самого начала не с чем работать. Он, кстати, прекрасно справляется, и целиком меня удовлетворяет, и поскольку кавычки в имени файла вещь достаточно необычная (не уверен даже, что все ОС поддерживают такие имена), то в этой части проблем никаких не было. Однако, кавычки исчезают из всех аргументов передаваемых в шелле.

          • sed теряет кавычки и не хочет  работать, !*! bagas, 18:04 , 30-Дек-20 (17)
            >[оверквотинг удален]
            > только для каждой совпавшей строки передать 2 значения (текстовую ссылку на
            > файл и совпавшее расширение файла) из неё в скрипт, после чего
            > заменить всю строку на вывод скрипта.
            > Для всего этого используется модификатор e, но, как можно видеть из примера,
            > кавычки исчезают в процессе, а значит скрипту уже с самого начала
            > не с чем работать. Он, кстати, прекрасно справляется, и целиком меня
            > удовлетворяет, и поскольку кавычки в имени файла вещь достаточно необычная (не
            > уверен даже, что все ОС поддерживают такие имена), то в этой
            > части проблем никаких не было. Однако, кавычки исчезают из всех аргументов
            > передаваемых в шелле.

            Напиши что есть и что должно получиться в итоге.

            • sed теряет кавычки и не хочет  работать, !*! Аноним, 18:17 , 30-Дек-20 (18)
              Я уже несколько раз написал. Есть это:

               $  echo 'value1="111" value2="222.ext" value3="333" otherdata' | sed -e 's/\(.*\)"\(.*\)\(\.ext\)"\(.*\)/echo \1"\2\3"\4/e'
              value1=111 value2=222.ext value3=333 otherdata

              в результате исполнения этого кода должно быть как тут:

               $  echo 'value1="111" value2="222.ext" value3="333" otherdata' | sed -e 's/\(.*\)"\(.*\)\(\.ext\)"\(.*\)/\1"\2\3"\4/'
              value1="111" value2="222.ext" value3="333" otherdata

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

              • sed теряет кавычки и не хочет  работать, !*! Аноним, 20:29 , 30-Дек-20 (19)
                Пока переписал на выборку из файла всех путей этой регуляркой (референсы 2 и 3) и потом в цикле для каждой строки с путём inplace sed исправляет невалидные значения в этом файле. Теперь вместо gnu sed зависимость gnu bash, и эффективность пострадала -- файлы перечитываются миллионы раз. Почему я никак не могу экранировать ссылки в sed? Никогда меня ещё так не раздражали тупые вопросы в гугле: в выдаче что угодно, только не эта проблема. Уже не представляю, как сформулировать запрос, что бы хоть что-нибудь нашлось.
              • sed теряет кавычки и не хочет  работать, !*! Аноним, 10:08 , 31-Дек-20 (20) –1
                > Я уже несколько раз написал. Есть это:
                >
                 $  echo 'value1="111" value2="222.ext" value3="333" otherdata' | sed -e 's/\(.*\)"\(.*\)\(\.ext\)"\(.*\)/echo 
                > \1"\2\3"\4/e'
                > value1=111 value2=222.ext value3=333 otherdata

                > в результате исполнения этого кода должно быть как тут:
                >
                 $  echo 'value1="111" value2="222.ext" value3="333" otherdata' | sed -e 's/\(.*\)"\(.*\)\(\.ext\)"\(.*\)/\1"\2\3"\4/' 
                > value1="111" value2="222.ext" value3="333" otherdata

                > Тогда полученные данные можно будет передать в скрипт (который исполняется для каждой
                > строки с совпадением).

                echo 'vlaue1="111" value2="222.ext" value3="333" otherdata'|sed -n 's/\(.*\)\ \(.*\)\ \(.*\)\ \(.*\)/1:\1 2:\2 3:\3 4:\4/p'
                1:vlaue1="111" 2:value2="222.ext" 3:value3="333" 4:otherdata

                ЗЫ. Излагаете отвратно - хрен поймешь, что действительно нужно получить в результате.
                С наступающим.

                • sed теряет кавычки и не хочет  работать, !*! Аноним, 10:40 , 31-Дек-20 (21)
                  Да, спасибо (нет). Пробелов там не будет, там будут всякие call(123, "arg", 0.1, "path/file.ext") и path="path/file.ext" в _произвольной_ части строки. Но, можно зацепиться за то, что упоминания файлов можно как-то идентифицировать, что я и сделал.

                  Нужно именно то, что написано в ОП, а именно: исполнить команду шелла и подставить в неё ссылки. И, поскольку выцепить все данные регуляркой и заменить конкретно их я и так смог (вполне ожидаемо), теперь я хочу только сделать лучше и избавиться от нездорового оверхэда исправив решение, которое изначально проще и лучше. И всё как бы работает, да только "sed теряет кавычки и не хочет  работать".

                  Я даже примеры кода привёл, хватит тратить моё время в таком случае.

                  • sed теряет кавычки и не хочет  работать, !*! Аноним, 11:04 , 31-Дек-20 (22)
                    >[оверквотинг удален]
                    > 0.1, "path/file.ext") и path="path/file.ext" в _произвольной_ части строки. Но, можно
                    > зацепиться за то, что упоминания файлов можно как-то идентифицировать, что я
                    > и сделал.
                    > Нужно именно то, что написано в ОП, а именно: исполнить команду шелла
                    > и подставить в неё ссылки. И, поскольку выцепить все данные регуляркой
                    > и заменить конкретно их я и так смог (вполне ожидаемо), теперь
                    > я хочу только сделать лучше и избавиться от нездорового оверхэда исправив
                    > решение, которое изначально проще и лучше. И всё как бы работает,
                    > да только "sed теряет кавычки и не хочет  работать".
                    > Я даже примеры кода привёл, хватит тратить моё время в таком случае.

                    Религия запрещает использовать в качестве разделителя _не_пробел, а запятые?

                    \(.*\),

                  • sed теряет кавычки и не хочет  работать, !*! markus, 11:27 , 02-Янв-21 (24)
                    >[оверквотинг удален]
                    > 0.1, "path/file.ext") и path="path/file.ext" в _произвольной_ части строки. Но, можно
                    > зацепиться за то, что упоминания файлов можно как-то идентифицировать, что я
                    > и сделал.
                    > Нужно именно то, что написано в ОП, а именно: исполнить команду шелла
                    > и подставить в неё ссылки. И, поскольку выцепить все данные регуляркой
                    > и заменить конкретно их я и так смог (вполне ожидаемо), теперь
                    > я хочу только сделать лучше и избавиться от нездорового оверхэда исправив
                    > решение, которое изначально проще и лучше. И всё как бы работает,
                    > да только "sed теряет кавычки и не хочет  работать".
                    > Я даже примеры кода привёл, хватит тратить моё время в таком случае.

                    Какие примеры коды? )))
                    Ты сам не понимаешь чего хочешь?!
                    Жуть, и вот такие горе админы пробиваются в верхи и после пытаются управлять отделами!
                    Жуть, просто жуть!

                    • sed теряет кавычки и не хочет  работать, !*! Аноним, 13:41 , 02-Янв-21 (27)
                      Если у вас проблемы с восприятием, это же не значит, что они есть у всех. Я привёл пример кода, достаточно иллюстрирующий суть проблемы.

                      Начнём с того, что решить задачу другим путём, что мне предлагает каждый первый, в принципе невозможно. Да, можно написать скрипт который будет искать 2 кавычки на каждой строке, запоминать их позиции, и посимвольно проверять, чтобы на конце было подходящее расширение файла. После чего строить новую строку с новой ссылкой на файл. И то, это же всё равно сломается, если у нас многострочная строка. К частью, такое мне ещё не встречалось. Или же можно использовать примитивную регулярочку, которая сделает всё желаемое с минимум затрат.

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

                      • sed теряет кавычки и не хочет  работать, !*! Аноним, 13:51 , 02-Янв-21 (28)
                        Ещё можно использовать bison и компанию. Да, можно сделать хорошо, даже лучше, более узкоспециализированно. Но зачем, если ссылка "никогда" не будет разбита на несколько строк? Это в принципе достаточно невероятная ситуация, на практике повстречать такой код не придётся действительно никогда. Sed более чем достаточно.
  • sed теряет кавычки и не хочет  работать, !*! Аноним, 18:34 , 03-Янв-21 (29)
    Не уверен что правильно понял задачу, но возможно это как-то поможет:

    $ echo -e 'value1="111" value2="222.ext" value3="333" otherdata\nvalue1="1" value2="2" value3="3" otherdata' | sed -e 's/"/\\"/g;s/\(.*\)\\"\(.*\)\(\.ext\)\\"\(.*\)/echo \1\\"\2\3\\"\4/e;s/\\"/\"/g'

    value1="111" value2="222.ext" value3="333" otherdata
    value1="1" value2="2" value3="3" otherdata
    • sed теряет кавычки и не хочет  работать, !*! Аноним, 18:51 , 03-Янв-21 (30)
      Как вариант. Ещё использую со страницами, там кавычки вообще заменены на " и можно так с ними и работать или же перегонять в другие кавычки. Вопрос "проглатывания" принципиально не решаемый? Неужели они не подумали о том, что ссылки как-то нужно защищать от подобного?
      • sed теряет кавычки и не хочет  работать, !*! Аноним, 18:52 , 03-Янв-21 (31)
        Заменены на & quot; //fix
      • sed теряет кавычки и не хочет  работать, !*! Аноним, 20:27 , 03-Янв-21 (32)
        Двойные кавычки съедает echo, а не sed. Чтобы он этого не делал, нужно передать ему строку, заключённую в одинарные кавычки. Но поскольку всё это уже находится в одинарных кавычках, то, чтобы шелл правильно всё распарсил, нужна такая последовательность (один из вариантов): '"'"'

        Т.е. первый апостроф заканчивает строку; затем идёт строка в двойных кавычках, которая и передаёт нужный нам апостроф; и последний апостроф снова начинает (продолжает) строку в одинарных кавычках.

        $ echo -e 'value1="111" value2="222.ext" value3="333" otherdata\nvalue1="1" value2="2" value3="3" otherdata' | sed -e 's/\(.*\)"\(.*\)\(\.ext\)"\(.*\)/echo '"'"'\1\"\2\3\"\4'"'"'/e'

        value1="111" value2="222.ext" value3="333" otherdata
        value1="1" value2="2" value3="3" otherdata



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру