LINUX.ORG.RU

подскажите с регуляркой.


0

1

доброй ночи.

есть строки, в которых в начале, может быть спец-слово заключенное в одинарные кавычки.

«'DOWNLOAD' url for download from»

«'PATCH' patch file name»

e t.c...

подскажите, как мне подобные строки разбить на две составляющие?: 1)спец-слово, 2)остальную часть строки

благодарен.

★★★

Последнее исправление: niXman (всего исправлений: 3)

Ответ на: комментарий от cx

echo «'PATCH' patch' file name» | awk -F"'" '{print $2, «\n» $3}' FAILED например

ei-grad ★★★★★
()
Ответ на: комментарий от cx

Хоть ТС и ничего не говорил про апострофы в остальной части строки, но данный способ с участием [g]awk будет резать $3 по очередной встреченный апостроф, а не до конца строки.

blexey ★★★★★
()
Ответ на: комментарий от blexey

да. в строке не может быть более апострофов, кроме тех двух в начале.

еще забыл уточнить: в начале строки может и не быть спец-слова. возможно ли с таком случае вернуть какой-то идентификатор, чтоб я мог обработать такую строку по особому?

niXman ★★★
() автор топика
Ответ на: комментарий от AGUtilities

спасибо. я знаю как это реализовать с использованием пайтон. но интересует решение в рамках bash.

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

в начале строки может и не быть спец-слова. возможно ли с таком случае вернуть какой-то идентификатор, чтоб я мог обработать такую строку по особому?

Учитывая что в строке таки больше не может быть спец-символов:

$ z="hello"
$ echo $z  | grep -q \' || echo ACHTUNG
ACHTUNG
$ z="'PATCH' patch file name"
$ echo $z  | grep -q \' || echo ACHTUNG

или:

z="'PATCH' patch file name"
if [[ `echo ${z:0:1}` != "'" ]]; then echo "ACHTUNG"; fi;

Предыдущий ответ тоже пофиксил:

echo "'PATCH' patch' file name" | awk -F"'" '{print $2; print substr($0, index($0,$3))}'
PATCH
 patch' file name
Сейчас меня снова побют :)

cx ★★
()
Ответ на: комментарий от niXman

Вот более хитрый вариант на [g]awk:

#!/bin/awk -f
/^'.*'/{
## Всё, что начинается со 'строки' - смотрим, на сколько N удастся нарезать:
  N = split($0, S, "'")
  if (N>3) {
# собрать правильный хвост из нарезки S не получится, поэтому берём хвост T как всё, что лежит в $0 после S[2] в двух апострофах
    T = substr($0, 1 + length(S[2]) + 2, length($0))
  } else {
# хвост собирать не требуется
    T = S[3]
  }
  print "A) \"" $0 "\" [" N "] -> W=\"" S[2] "\", T=\"" T "\""
}
/^[^']/{
## Всё остальное - выдаём как есть:
  print "B) T=\"" $0 "\""
}

который исходные данные

'hello' world!
'hi' there !!!11
'jkd'  19024 901 2408 1024 204129
'hard'  to split' right
situation b ...
нарезает следующим образом:
A) "'hello' world!" [3] -> W="hello", T=" world!"
A) "'hi' there !!!11" [3] -> W="hi", T=" there !!!11"
A) "'jkd'  19024 901 2408 1024 204129" [3] -> W="jkd", T="  19024 901 2408 1024 204129"
A) "'hard'  to split' right" [4] -> W="hard", T="  to split' right"
B) T="situation b ..."

blexey ★★★★★
()
Ответ на: комментарий от blexey

благодарен.

но скажите, как мне Ваш код использовать в паре с bash скриптом? я так понял, Ваш пример рассчитан быть в отдельном файле?

niXman ★★★
() автор топика
Ответ на: комментарий от blexey

Подсократил лишние сущности:

#!/bin/awk -f
{
# Всё, что начинается со 'строки' - смотрим, на сколько N удастся нарезать:
  N = split($0, S, "'")
  if (N==1) {
    print "B) T=\"" $0 "\""
  } else {
    if (N>3) {
# собрать правильный хвост из нарезки S не получится, поэтому берём хвост T как всё, что лежит в $0 после S[2] в двух апострофах
      T = substr($0, 1 + length(S[2]) + 2)
    } else {
# хвост собирать не требуется
      T = S[3]
    }
    print "A) \"" $0 "\" [" N "] -> W=\"" S[2] "\", T=\"" T "\""
  }
}

blexey ★★★★★
()
Ответ на: комментарий от niXman

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

blexey ★★★★★
()
$ sed -r  "/^'[^']*'/{s/^'([^']*)'(.*)/X=\"\1\"\nY=\"\2\"/;b;};s/.*/Y=\"&\"/" niXman 
X="DOWNLOAD"
Y=" url for download from"
Y=""
X="PATCH"
Y=" patch file name"
Y=""
Y="e t.c... "

не?

drBatty ★★
()
Ответ на: комментарий от niXman

простите, а не подскажите кто такие X и Y, и как их использовать?

откуда я знаю? просто из головы взял. Вы же так и не сказали, что в вы подразумеваете под «использованием»?

В принципе, sed умеет расфасовывать поток на два потока (как tee, но интеллектуально), для этого используется команда W, что-то пишется в один файл, что-то в другой.

drBatty ★★
()
Ответ на: комментарий от drBatty

откуда я знаю? просто из головы взял.

=)

что в вы подразумеваете под «использованием»?

ну, в общем, идеальной была бы возможность чтоб sed полученные две подстроки запихивал в две переменные. это возможно?

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

ну, в общем, идеальной была бы возможность чтоб sed полученные две подстроки запихивал в две переменные. это возможно?

нет. принципиально. процесс не может изменить переменные родителя. Да и смысл? Только если пихать в массив...

Но можно сделать лучше - запихать найденные значения прямо в параметры команды, а потом её выполнить. Ведь переменные - не самоцель?

drBatty ★★
()
Ответ на: комментарий от drBatty

процесс не может изменить переменные родителя.

логично.

можно сделать лучше - запихать найденные значения прямо в параметры команды

да. вполне подходит. а не подскажите как это сделать? ;)

благодарен.

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

да. вполне подходит. а не подскажите как это сделать? ;)

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

$ echo "sin(3.14)" | sed -rn 's/.*sin\(([0-9]*\.[0-9]*)\).*/echo "s(\1)" | bc -l/ep'
.00159265291648695254

команда bc -l считает синусы.

Вот только пользоваться этим надо ОЧЕНЬ осторожно! Не надо забывать, что злоумышленник может протащить свой вредоносный код на исполнение. В данном случае это не возможно, ибо исполняется команда, в которой только число, а если эта не число, то sed ничего выполнять не станет.

drBatty ★★
()
Ответ на: комментарий от niXman

Вы меня запутали напрочь... синуты-то тут при чем? %)

в том-то и дело, что синусы тут не причём. Их не умеет ни sed, ни gawk. Это пример того, как можно вычислить синус sed'ом. Т.е. выполнить абсолютно левую задачу.

Ну а какая задача у вас - сиё мне неведомо...

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.