Здравствуйте, подскажите, спасибо. 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 и не попадают в скрипт.
Теряется именно в процессе исполнения что можно пронаблюдать отключив его:
echo 'value1="111" value2="222.ext" value3="333" otherdata' | sed -e 's/\(.*\)"\(.*\)\(\.ext\)"\(.*\)/1:"\1" 2:"\2" 3:"\3" 4:"\4"/'
Господа студиозусы, вы слегка достали. Уже третий раз за месяц один и тот же вопрос.У тебя стандартная задача разобрать хэш { key=value }. Ну так и разбирай его с помощью правильного инструмента. Исходный поток [чем-нибудь] преобразуешь в правильный JSON, потом разбираешь JSON:
echo '{ "value1"="111", "value2"="222.ext", "value3"="333" }' | tr = : | jq .value2
Надеюсь, ты догадаешься, как добавить недостающие запятые и кавычки, где нужно.
> Господа студиозусы, вы слегка достали. Уже третий раз за месяц один и
> тот же вопрос.
> У тебя стандартная задача разобрать хэш { 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.
Вот так и поговорили.Ещё раз - не изобретайте велосипед. Приведите исходный поток к JSON, потом спросите jq.
Нет, нужен sed. Необходимо вычленить все строки с файлами, проверить чтобы эти файлы были разрешёнными, потом передать все совпавшие строки в скрипт в котором проверяется существование файла на диске и его данные такие как новое имя (и расширение), и пометить некорректные данные. С этим справляются элементарное регулярное выражение и сед. "Умники" с tr несколько раздражают. Задача максимально чётко описана. Подскажите как решить проболему, или проходите мимо. Спасибо.
Ну, некоторые мышки плакали, кололись, но продолжали жрать кактус. Похвальная целеустремлённость. Эту бы энергию, да в мирных целях.Я ещё раз повторю основной тезис - новый велосипед с квадратными колёсами возможен. Но не нужен. Слегка преобразуй входной поток и будет тебе счастье.
Ты хочешь заняться онанизмом вприсядку с помощью sed или решить конкретную задачу?
Да ну какой входной поток? На входе файлы со скриптами, там любые данные в строках и их не нужно изменять как-либо. А вот данные (и файлы) к которым скрипты обращаются, можно и нужно обработать, найти потерянные на диске данные и пометить вовсе отсутствующие.
Не путай тёплое с мягким.На входе не файлы, а имена файлов. И это поток, в котором не любые данные, а форматированные строки. Оформи их, как правильные строки в терминах JSON, это не настолько сложно.
Хватит тупить, перечитай всё с самого начала и проговори вслух, что именно ты делаешь.
Форматирование там совершенно случайное и оно меня никак не интересует, это забота препроцессоров и компиляторов его потом разбирать. Меня интересуют только та часть, где происходит обращение к данным. Я могу эту часть проанализировать таким же однострочником и произвести замены в совпавших строках при необходимости. Просто признай неправоту и уходи, не надо хамить.
> Здравствуйте, подскажите, спасибо. 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="") с содержимым в двойных кавычках нужно убрать, остальное оставить?
Данные (222.ext) нужно извлечь и обработать, но я так понимаю в sed нет условных операторов и поэтому используется шелл-однострочник, в который эта строка 222.ext и передаётся. Все остальные элементы строки должны оставаться без изменения. Дополнительным препятствием является то, что там будет разнообразные спецсимволы, которые совершенно нельзя трогать.В текущем виде мы получаем строку до совпадения, имя файла (222), расширение (ext, но в оригинале там более интересная конструкция), и всё после совпадения, после чего скрипт возвращает нам корректную строку собранную обратно на основании этих 4 элементов. Содержимое до и после 222.ext вообще не интересно и должно остаться исходным. может быть что-то по типу echo -n "\1\""; /script.sh \2 \3; echo -n "\"\4"/e также даст нужный результат, но я просто возвращаю готовую строку.
Проблема заключается в том, что /e съедает все кавычки из строки.
>[оверквотинг удален]
> Дополнительным препятствием является то, что там будет разнообразные спецсимволы, которые
> совершенно нельзя трогать.
> В текущем виде мы получаем строку до совпадения, имя файла (222), расширение
> (ext, но в оригинале там более интересная конструкция), и всё после
> совпадения, после чего скрипт возвращает нам корректную строку собранную обратно на
> основании этих 4 элементов. Содержимое до и после 222.ext вообще не
> интересно и должно остаться исходным. может быть что-то по типу echo
> -n "\1\""; /script.sh \2 \3; echo -n "\"\4"/e также даст нужный
> результат, но я просто возвращаю готовую строку.
> Проблема заключается в том, что /e съедает все кавычки из строки.Все равно не понял.
Что значит извлечь и обработать в вашем понимании?
Вам просто нужно спарсить значение в ковычках у значения value2?
Получить из строки и заменить на другое (при необходимости). Задача модифицировать данные или оставить их в исходном виде уже решена отдельно, нам нужно только для каждой совпавшей строки передать 2 значения (текстовую ссылку на файл и совпавшее расширение файла) из неё в скрипт, после чего заменить всю строку на вывод скрипта.Для всего этого используется модификатор e, но, как можно видеть из примера, кавычки исчезают в процессе, а значит скрипту уже с самого начала не с чем работать. Он, кстати, прекрасно справляется, и целиком меня удовлетворяет, и поскольку кавычки в имени файла вещь достаточно необычная (не уверен даже, что все ОС поддерживают такие имена), то в этой части проблем никаких не было. Однако, кавычки исчезают из всех аргументов передаваемых в шелле.
>[оверквотинг удален]
> только для каждой совпавшей строки передать 2 значения (текстовую ссылку на
> файл и совпавшее расширение файла) из неё в скрипт, после чего
> заменить всю строку на вывод скрипта.
> Для всего этого используется модификатор e, но, как можно видеть из примера,
> кавычки исчезают в процессе, а значит скрипту уже с самого начала
> не с чем работать. Он, кстати, прекрасно справляется, и целиком меня
> удовлетворяет, и поскольку кавычки в имени файла вещь достаточно необычная (не
> уверен даже, что все ОС поддерживают такие имена), то в этой
> части проблем никаких не было. Однако, кавычки исчезают из всех аргументов
> передаваемых в шелле.Напиши что есть и что должно получиться в итоге.
Я уже несколько раз написал. Есть это:
$ 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Тогда полученные данные можно будет передать в скрипт (который исполняется для каждой строки с совпадением).
Пока переписал на выборку из файла всех путей этой регуляркой (референсы 2 и 3) и потом в цикле для каждой строки с путём inplace sed исправляет невалидные значения в этом файле. Теперь вместо gnu sed зависимость gnu bash, и эффективность пострадала -- файлы перечитываются миллионы раз. Почему я никак не могу экранировать ссылки в sed? Никогда меня ещё так не раздражали тупые вопросы в гугле: в выдаче что угодно, только не эта проблема. Уже не представляю, как сформулировать запрос, что бы хоть что-нибудь нашлось.
> Я уже несколько раз написал. Есть это:
>$ 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ЗЫ. Излагаете отвратно - хрен поймешь, что действительно нужно получить в результате.
С наступающим.
Да, спасибо (нет). Пробелов там не будет, там будут всякие call(123, "arg", 0.1, "path/file.ext") и path="path/file.ext" в _произвольной_ части строки. Но, можно зацепиться за то, что упоминания файлов можно как-то идентифицировать, что я и сделал.Нужно именно то, что написано в ОП, а именно: исполнить команду шелла и подставить в неё ссылки. И, поскольку выцепить все данные регуляркой и заменить конкретно их я и так смог (вполне ожидаемо), теперь я хочу только сделать лучше и избавиться от нездорового оверхэда исправив решение, которое изначально проще и лучше. И всё как бы работает, да только "sed теряет кавычки и не хочет работать".
Я даже примеры кода привёл, хватит тратить моё время в таком случае.
>[оверквотинг удален]
> 0.1, "path/file.ext") и path="path/file.ext" в _произвольной_ части строки. Но, можно
> зацепиться за то, что упоминания файлов можно как-то идентифицировать, что я
> и сделал.
> Нужно именно то, что написано в ОП, а именно: исполнить команду шелла
> и подставить в неё ссылки. И, поскольку выцепить все данные регуляркой
> и заменить конкретно их я и так смог (вполне ожидаемо), теперь
> я хочу только сделать лучше и избавиться от нездорового оверхэда исправив
> решение, которое изначально проще и лучше. И всё как бы работает,
> да только "sed теряет кавычки и не хочет работать".
> Я даже примеры кода привёл, хватит тратить моё время в таком случае.Религия запрещает использовать в качестве разделителя _не_пробел, а запятые?
\(.*\),
Там разное число элементов. Может быть вообще 1 на всю строку, а может быть и 2. И это не то, о чём был вопрос. В общем, это обсуждение в этом топике в очередной раз иллюстрирует уровень сегодняшнего рунета.
> Там разное число элементов. Может быть вообще 1 на всю строку, а
> может быть и 2. И это не то, о чём был
> вопрос. В общем, это обсуждение в этом топике в очередной раз
> иллюстрирует уровень сегодняшнего рунета.)))
Начни для начало с себя!
Начни правильно излагать задачу!!!
Ну так я хочу, чтобы "исполнение команды" в sed не проглатывало кавычки. О чём и сообщил уже раз 15. Очевидно, что я не хочу tr и jq, которые мне ничем не помогут. Чем задача не правильная, разве она не была сформулирована вполне конкретно? Проблема тут только в "читателях".
>[оверквотинг удален]
> 0.1, "path/file.ext") и path="path/file.ext" в _произвольной_ части строки. Но, можно
> зацепиться за то, что упоминания файлов можно как-то идентифицировать, что я
> и сделал.
> Нужно именно то, что написано в ОП, а именно: исполнить команду шелла
> и подставить в неё ссылки. И, поскольку выцепить все данные регуляркой
> и заменить конкретно их я и так смог (вполне ожидаемо), теперь
> я хочу только сделать лучше и избавиться от нездорового оверхэда исправив
> решение, которое изначально проще и лучше. И всё как бы работает,
> да только "sed теряет кавычки и не хочет работать".
> Я даже примеры кода привёл, хватит тратить моё время в таком случае.Какие примеры коды? )))
Ты сам не понимаешь чего хочешь?!
Жуть, и вот такие горе админы пробиваются в верхи и после пытаются управлять отделами!
Жуть, просто жуть!
Если у вас проблемы с восприятием, это же не значит, что они есть у всех. Я привёл пример кода, достаточно иллюстрирующий суть проблемы.Начнём с того, что решить задачу другим путём, что мне предлагает каждый первый, в принципе невозможно. Да, можно написать скрипт который будет искать 2 кавычки на каждой строке, запоминать их позиции, и посимвольно проверять, чтобы на конце было подходящее расширение файла. После чего строить новую строку с новой ссылкой на файл. И то, это же всё равно сломается, если у нас многострочная строка. К частью, такое мне ещё не встречалось. Или же можно использовать примитивную регулярочку, которая сделает всё желаемое с минимум затрат.
Собственно, именно это я и сделал, оставив выражение матчинга без изменений. Только теперь я получаю список файлов и заменяю каждое совпадение, вместо того чтобы sed сразу совершил все необходимые замены.
Ещё можно использовать bison и компанию. Да, можно сделать хорошо, даже лучше, более узкоспециализированно. Но зачем, если ссылка "никогда" не будет разбита на несколько строк? Это в принципе достаточно невероятная ситуация, на практике повстречать такой код не придётся действительно никогда. Sed более чем достаточно.
Не уверен что правильно понял задачу, но возможно это как-то поможет:
$ 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
Как вариант. Ещё использую со страницами, там кавычки вообще заменены на " и можно так с ними и работать или же перегонять в другие кавычки. Вопрос "проглатывания" принципиально не решаемый? Неужели они не подумали о том, что ссылки как-то нужно защищать от подобного?
Заменены на & quot; //fix
Двойные кавычки съедает 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