The OpenNET Project / Index page

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



"sed теряет кавычки и не хочет  работать"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"sed теряет кавычки и не хочет  работать"  +/
Сообщение от Аноним (0), 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 и им мы будем оперировать, необходимо чтобы остальные сроки были переданы в скрипт без подобных модификаций навроде исчезающего содержимого. А то всё в кашу превращается.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "sed теряет кавычки и не хочет  работать"  +/
Сообщение от Аноним (0), 30-Дек-20, 11:17 
Я перебрал наверное все известные мне варианты экранирования кавычек (и нашёл в поисковой системе некоторые странные). Ничего не получается.
Ответить | Правка | Наверх | Cообщить модератору

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

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

\([^"]*\)

Ответить | Правка | Наверх | Cообщить модератору

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

4. "sed теряет кавычки и не хочет  работать"  +/
Сообщение от Аноним (0), 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"/'

Ответить | Правка | К родителю #2 | Наверх | Cообщить модератору

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

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

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

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


Ответить | Правка | Наверх | Cообщить модератору

6. "sed теряет кавычки и не хочет  работать"  +/
Сообщение от bagas (ok), 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.

Ответить | Правка | Наверх | Cообщить модератору

7. "sed теряет кавычки и не хочет  работать"  +/
Сообщение от ACCA (ok), 30-Дек-20, 12:43 
Вот так и поговорили.

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

Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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


Ответить | Правка | Наверх | Cообщить модератору

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

13. "sed теряет кавычки и не хочет  работать"  +/
Сообщение от bagas (ok), 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="") с содержимым в двойных кавычках нужно убрать, остальное оставить?

Ответить | Правка | Наверх | Cообщить модератору

14. "sed теряет кавычки и не хочет  работать"  +/
Сообщение от Аноним (0), 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 съедает все кавычки из строки.

Ответить | Правка | Наверх | Cообщить модератору

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

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

Ответить | Правка | Наверх | Cообщить модератору

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

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

Ответить | Правка | Наверх | Cообщить модератору

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

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

Ответить | Правка | Наверх | Cообщить модератору

18. "sed теряет кавычки и не хочет  работать"  +/
Сообщение от Аноним (0), 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

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

Ответить | Правка | Наверх | Cообщить модератору

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

20. "sed теряет кавычки и не хочет  работать"  –1 +/
Сообщение от Аноним (20), 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

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

Ответить | Правка | К родителю #18 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | Наверх | Cообщить модератору

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

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

\(.*\),

Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | К родителю #21 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | Наверх | Cообщить модератору

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

29. "sed теряет кавычки и не хочет  работать"  +/
Сообщение от Аноним (29), 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
Ответить | Правка | Наверх | Cообщить модератору

30. "sed теряет кавычки и не хочет  работать"  +/
Сообщение от Аноним (0), 03-Янв-21, 18:51 
Как вариант. Ещё использую со страницами, там кавычки вообще заменены на " и можно так с ними и работать или же перегонять в другие кавычки. Вопрос "проглатывания" принципиально не решаемый? Неужели они не подумали о том, что ссылки как-то нужно защищать от подобного?
Ответить | Правка | Наверх | Cообщить модератору

31. "sed теряет кавычки и не хочет  работать"  +/
Сообщение от Аноним (0), 03-Янв-21, 18:52 
Заменены на & quot; //fix
Ответить | Правка | Наверх | Cообщить модератору

32. "sed теряет кавычки и не хочет  работать"  +/
Сообщение от Аноним (29), 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
Ответить | Правка | К родителю #30 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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