URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10345
[ Назад ]

Исходное сообщение
"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 теряет кавычки и не хочет  работать"
Отправлено Аноним , 30-Дек-20 11:17 
Я перебрал наверное все известные мне варианты экранирования кавычек (и нашёл в поисковой системе некоторые странные). Ничего не получается.

"sed теряет кавычки и не хочет  работать"
Отправлено Аноним , 30-Дек-20 12:14 
> Нас интересует value2 и им мы будем оперировать
> А то всё в кашу превращается.

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

\([^"]*\)


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

"sed теряет кавычки и не хочет  работать"
Отправлено Аноним , 30-Дек-20 12:33 
Теряется именно в процессе исполнения что можно пронаблюдать отключив его:

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


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

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

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

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



"sed теряет кавычки и не хочет  работать"
Отправлено bagas , 30-Дек-20 12:38 
> Господа студиозусы, вы слегка достали. Уже третий раз за месяц один и
> тот же вопрос.
> У тебя стандартная задача разобрать хэш { 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 теряет кавычки и не хочет  работать"
Отправлено ACCA , 30-Дек-20 12:43 
Вот так и поговорили.

Ещё раз - не изобретайте велосипед. Приведите исходный поток к JSON, потом спросите jq.


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

"sed теряет кавычки и не хочет  работать"
Отправлено ACCA , 30-Дек-20 12:54 
Ну, некоторые мышки плакали, кололись, но продолжали жрать кактус. Похвальная целеустремлённость. Эту бы энергию, да в мирных целях.

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

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


"sed теряет кавычки и не хочет  работать"
Отправлено Аноним , 30-Дек-20 12:59 
Да ну какой входной поток? На входе файлы со скриптами, там любые данные в строках и их не нужно изменять как-либо. А вот данные (и файлы) к которым скрипты обращаются, можно и нужно обработать, найти потерянные на диске данные и пометить вовсе отсутствующие.

"sed теряет кавычки и не хочет  работать"
Отправлено ACCA , 30-Дек-20 13:17 
Не путай тёплое с мягким.

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

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



"sed теряет кавычки и не хочет  работать"
Отправлено Аноним , 30-Дек-20 13:24 
Форматирование там совершенно случайное и оно меня никак не интересует, это забота препроцессоров и компиляторов его потом разбирать. Меня интересуют только та часть, где происходит обращение к данным. Я могу эту часть проанализировать таким же однострочником и произвести замены в совпавших строках при необходимости. Просто признай неправоту и уходи, не надо хамить.

"sed теряет кавычки и не хочет  работать"
Отправлено bagas , 30-Дек-20 15:29 
> Здравствуйте, подскажите, спасибо. 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 теряет кавычки и не хочет  работать"
Отправлено Аноним , 30-Дек-20 15:46 
Данные (222.ext) нужно извлечь и обработать, но я так понимаю в sed нет условных операторов и поэтому используется шелл-однострочник, в который эта строка 222.ext и передаётся. Все остальные элементы строки должны оставаться без изменения. Дополнительным препятствием является то, что там будет разнообразные спецсимволы, которые совершенно нельзя трогать.

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

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


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

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


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

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


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

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


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

 $  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 теряет кавычки и не хочет  работать"
Отправлено Аноним , 30-Дек-20 20:29 
Пока переписал на выборку из файла всех путей этой регуляркой (референсы 2 и 3) и потом в цикле для каждой строки с путём inplace sed исправляет невалидные значения в этом файле. Теперь вместо gnu sed зависимость gnu bash, и эффективность пострадала -- файлы перечитываются миллионы раз. Почему я никак не могу экранировать ссылки в sed? Никогда меня ещё так не раздражали тупые вопросы в гугле: в выдаче что угодно, только не эта проблема. Уже не представляю, как сформулировать запрос, что бы хоть что-нибудь нашлось.

"sed теряет кавычки и не хочет  работать"
Отправлено Аноним , 31-Дек-20 10:08 
> Я уже несколько раз написал. Есть это:
>
 $  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 теряет кавычки и не хочет  работать"
Отправлено Аноним , 31-Дек-20 10:40 
Да, спасибо (нет). Пробелов там не будет, там будут всякие call(123, "arg", 0.1, "path/file.ext") и path="path/file.ext" в _произвольной_ части строки. Но, можно зацепиться за то, что упоминания файлов можно как-то идентифицировать, что я и сделал.

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

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


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

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

\(.*\),


"sed теряет кавычки и не хочет  работать"
Отправлено Аноним , 31-Дек-20 11:44 
Там разное число элементов. Может быть вообще 1 на всю строку, а может быть и 2. И это не то, о чём был вопрос. В общем, это обсуждение в этом топике в очередной раз иллюстрирует уровень сегодняшнего рунета.

"sed теряет кавычки и не хочет  работать"
Отправлено markus , 02-Янв-21 11:29 
> Там разное число элементов. Может быть вообще 1 на всю строку, а
> может быть и 2. И это не то, о чём был
> вопрос. В общем, это обсуждение в этом топике в очередной раз
> иллюстрирует уровень сегодняшнего рунета.

)))
Начни для начало с себя!
Начни правильно излагать задачу!!!


"sed теряет кавычки и не хочет  работать"
Отправлено Аноним , 02-Янв-21 13:29 
Ну так я хочу, чтобы "исполнение команды" в sed не проглатывало кавычки. О чём и сообщил уже раз 15. Очевидно, что я не хочу tr и jq, которые мне ничем не помогут. Чем задача не правильная, разве она не была сформулирована вполне конкретно? Проблема тут только в "читателях".

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

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


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

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

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


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

"sed теряет кавычки и не хочет  работать"
Отправлено Аноним , 03-Янв-21 18:34 
Не уверен что правильно понял задачу, но возможно это как-то поможет:

$ 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 теряет кавычки и не хочет  работать"
Отправлено Аноним , 03-Янв-21 18:51 
Как вариант. Ещё использую со страницами, там кавычки вообще заменены на " и можно так с ними и работать или же перегонять в другие кавычки. Вопрос "проглатывания" принципиально не решаемый? Неужели они не подумали о том, что ссылки как-то нужно защищать от подобного?

"sed теряет кавычки и не хочет  работать"
Отправлено Аноним , 03-Янв-21 18:52 
Заменены на & quot; //fix

"sed теряет кавычки и не хочет  работать"
Отправлено Аноним , 03-Янв-21 20:27 
Двойные кавычки съедает 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