На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
Grih65kop
Сообщения: 145
Сообщение
Grih65kop » 16.06.2012 03:01
Существует данный текст:
Код: Выделить всё
blablablablabla
...
<title>123text123</title>
blablablablabla
...
Нужно выбрать из него строчку
Могу решить данную задачу при помощи grep и sed, но вот при помощи одного sed не получается.
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo
Сообщение
/dev/random » 16.06.2012 03:07
"sed -n" и флаг "p" команды "s"
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 16.06.2012 03:08
sed -rn 's/.*(123text123).*/\1/p'
Grih65kop
Сообщения: 145
Сообщение
Grih65kop » 16.06.2012 03:10
drBatty писал(а): ↑ 16.06.2012 03:08
sed -rn 's/.*(123text123).*/\1/p'
drBatty, текст динамический.
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 16.06.2012 03:14
sed '
/dev/random писал(а): ↑ 16.06.2012 03:07
"sed -n" и флаг "p" команды "s"
можно и без них
Код: Выделить всё
sed '/123text123/!d;s//\n&\n/;s/[^\n]*\n//;s/\n.*//'
Grih65kop писал(а): ↑ 16.06.2012 03:10
текст динамический.
что это такое?
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo
Сообщение
/dev/random » 16.06.2012 03:18
Grih65kop , просто удалите теги title из этой строки так, как вы это сделали бы, если бы строка уже была выбрана grep'ом, но укажите ключ и флаг, которые я назвал. В этом случае строки, где команда s провалится, выведены не будут.
Grih65kop
Сообщения: 145
Сообщение
Grih65kop » 16.06.2012 03:18
drBatty писал(а): ↑ 16.06.2012 03:14
sed '
/dev/random писал(а): ↑ 16.06.2012 03:07
"sed -n" и флаг "p" команды "s"
можно и без них
Код: Выделить всё
sed '/123text123/!d;s//\n&\n/;s/[^\n]*\n//;s/\n.*//'
Grih65kop писал(а): ↑ 16.06.2012 03:10
текст динамический.
что это такое?
То что он меняется и я его не знаю заранее.
Выбирать нужно то что находится между <title> и </title>.
Сперва я выбирал grep'ом строчку где "<title>.*</title>", а потом уже 's/.*<title>//;s/<\/title>.*//'.
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 16.06.2012 03:29
Grih65kop писал(а): ↑ 16.06.2012 03:18
Сперва я выбирал grep'ом строчку где "<title>.*</title>", а потом уже 's/.*<title>//;s/<\/title>.*//'.
как скажите
Grih65kop писал(а): ↑ 16.06.2012 03:18
Сперва я выбирал grep'ом строчку где "<title>.*</title>", а потом уже 's/.*<title>//;s/<\/title>.*//'.
дословно
Код: Выделить всё
sed '/<title>.*<\/title>/!d;s/.*<title>//;s/<\/title>.*//'
или
Код: Выделить всё
sed -n '/<title>.*<\/title>/{s/.*<title>//;s/<\/title>.*//p}'
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 16.06.2012 08:38
drBatty писал(а): ↑ 16.06.2012 03:29
Код: Выделить всё
sed '/<title>.*<\/title>/!d;s/.*<title>//;s/<\/title>.*//'
Код: Выделить всё
sed '/<title>.*<\/title>/!d;s/.*<title>\(.*\)<\/title>.*/\1/'
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 18.06.2012 03:41
SLEDopit писал(а): ↑ 16.06.2012 08:38
sed '/<title>.*<\/title>/!d;s/.*<title>\(.*\)<\/title>.*/\1/'
в данном случае так наверное тоже можно.
но...
$
$ echo "<title>xxx</title>yyy</title>" |sed '/<title>.*<\/title>/!d;s/.*<title>\(.*\)<\/title>.*/\1/'
xxx</title>yyy
$ echo "<title>xxx</title>yyy</title>" |sed '/<title>.*<\/title>/!d;s/.*<title>//;s/<\/title>.*//'
xxx
мой способ даёт ИМХО "более правильный" результат.
ЗЫЖ
$
$ echo "<title>xxx<title>zzz</title>yyy</title>" |sed '/<title>.*<\/title>/!d;s/.*<title>\(.*\)<\/title>.*/\1/'
zzz</title>yyy
$ echo "<title>xxx<title>zzz</title>yyy</title>" |sed '/<title>.*<\/title>/!d;s/.*<title>//;s/<\/title>.*//'
zzz
ну title может быть вложеным и не бывает, а вот <table> очень даже бывает.