Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13749
|
Из: Москва
|
Рейтинг: 3476
|
|
[sed/awk/?]как выделить слово из строки, идущее после заданного слова?
02.11.2007 21:53
|
|
|
т.е. имеется файл со строками примерно такого вида:
code:
bla-bla-bla KEYWORD "id" bla-bla-bla
bla-bla-bla KEYWORD "id" bla-bla-bla
bla-bla-bla KEYWORD "id" bla-bla-bla
bla-bla-bla KEYWORD "id" bla-bla-bla
(файл получен из другого при помощи grep "KEYWORD" file) где bla-bla-bla: произвольный текст разной длины. KEYWORD - фиксированное слово (KEYWORD) "id" - идентификатор в кавычках, идентификаторы от строки к строке могут различаться, а могут и повтроятся.
хотелось бы на выдаче получить список этих идетнтификаторов, трубопровод в uniq я уж в состоянии сделать.
|
|
Bachan
|
god's pee
|
|
|
|
Рег.: 26.10.2002
|
Сообщений: 37551
|
|
Рейтинг: 5335
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Basilio]
02.11.2007 21:55
|
|
|
sed 's/.*KEYWORD "\([0-9]*\)".*/\1/'
|
я АЭС фачил в эсс! |
|
Bachan
|
god's pee
|
|
|
|
Рег.: 26.10.2002
|
Сообщений: 37551
|
|
Рейтинг: 5335
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Bachan]
02.11.2007 21:58
|
|
|
даже так наверное лучше: sed 's/.*KEYWORD[^"]*"\([0-9]*\)".*/\1/' а то может после KEYWORD не пробел, а еще какая-нибудь херь.
|
я АЭС фачил в эсс! |
|
Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13749
|
Из: Москва
|
Рейтинг: 3476
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Bachan]
02.11.2007 22:03
|
|
|
идея понятна. почему он всю строку мне печатает. нужно чтобы только id печатал..
id - это буквы-цифры, а не только цифры.
|
|
Bachan
|
god's pee
|
|
|
|
Рег.: 26.10.2002
|
Сообщений: 37551
|
|
Рейтинг: 5335
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Basilio]
02.11.2007 22:06
|
|
|
ну замени на [a-zA-Z0-9]
почему греп всю строку печатает? ну он всегда так делает по умолчанию. мб можно заставить подстроку печатать, мне лень ман смотреть. =))
|
я АЭС фачил в эсс! |
|
Bachan
|
god's pee
|
|
|
|
Рег.: 26.10.2002
|
Сообщений: 37551
|
|
Рейтинг: 5335
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Bachan]
02.11.2007 22:07
|
|
|
sed 's/.*KEYWORD[^"]*"\([^"]*\)".*/\1/' вот так вообще все что угодно будет в id 
|
я АЭС фачил в эсс! |
|
Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13749
|
Из: Москва
|
Рейтинг: 3476
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Bachan]
02.11.2007 22:12
|
|
|
так вопрос в том и состоит, чтобы только подстроку id и напечатать.
|
|
Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13749
|
Из: Москва
|
Рейтинг: 3476
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Bachan]
02.11.2007 22:51
|
|
|
в общем, ничего проще придумать не удалось (awk):
code:
{
KWPOS=index($0,"KEYWORD")
TMPSTR=substr($0,KWPOS+9,200)
IDPOS=index(TMPSTR,"\"")
ID=substr(TMPSTR,1,IDPOS-1)
print ID
}
|
|
Bachan
|
god's pee
|
|
|
|
Рег.: 26.10.2002
|
Сообщений: 37551
|
|
Рейтинг: 5335
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Basilio]
03.11.2007 00:30
|
|
|
бля. а я тебе что написал?
cat log | grep KEYWORD | sed 's/.*KEYWORD[^"]*"\([^"]*\)".*/\1/'
|
я АЭС фачил в эсс! |
|
mk52
|
member
|
|
|
|
Рег.: 11.05.2007
|
Сообщений: 116
|
|
Рейтинг: 65
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Basilio]
03.11.2007 00:47
|
|
|
perl рулит ; )
extract_id.pl:
#!/usr/bin/perl
die "\n\nSYNOPSYS:\n\t$0 input_file\n\n" if (@ARGV < 1);
$inp = $ARGV[0];
die "File $inp doesn't exist" if (!(-e $inp)); open INP, $inp || die "Can't open $inp";
while ($str = <INP>) { print "$1\n" if ($str =~ /\s+KEYWORD\s+"([^"]+)"\s+/); }
close INP;
Редактировал mk52 (03.11.2007 03:31)
|
|
maloi
|
Зануда
|
|
|
|
Рег.: 09.05.2006
|
Сообщений: 6506
|
Из: $(pwd)
|
Рейтинг: 2880
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Bachan]
03.11.2007 00:48
|
|
|
sed 's/^.*KEYWORD[^"]*"\([^"]*\)".*$/\1/' может так лучше будет?
|
Помни: убив анимешника, ты повышаешь скорость сети на 5% |
|
Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13749
|
Из: Москва
|
Рейтинг: 3476
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Bachan]
03.11.2007 00:55
|
|
|
твое печатает всю строку целиком. мое печатае только id.
|
|
botWi
|
|
|
|
|
Рег.: 22.11.2003
|
Сообщений: 10160
|
Из: Moscow
|
Рейтинг: 1764
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Basilio]
03.11.2007 04:49
|
|
|
В ответ на:
твое печатает всю строку целиком.
дык его не срабатывает я sed не знаю но \( ОЧЕНЬ смущает может все таки просто () без слешей7
|
Хватит дрочить на рейтинги |
|
mmCleric
|
|
|
|
|
Рег.: 19.09.2004
|
Сообщений: 459
|
Из: Здесь
|
Рейтинг: 263
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Basilio]
03.11.2007 05:26
|
|
|
Эх... Отвечу всем сразу, раз все знаю  Во-первых,
code:
sed -n 's/.*KEYWORD[^"]*"\([^"]*\)".*/\1/p'
, чтобы не печатать те строки, в которых KEYWORD почему-то отсутствует. (вероятно, поэтому и проблемы). Во-вторых, \) и \) нужны, потому что это basic RE, а не extended. В-третьих, нормальное решение на перле будет выглядеть так: code:
perl -nle '/KEYWORD\s+"(.*?)"/ and print $1'
, а не тот ужас, который там выше написан.
|
-Ofun |
|
Bachan
|
god's pee
|
|
|
|
Рег.: 26.10.2002
|
Сообщений: 37551
|
|
Рейтинг: 5335
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Basilio]
03.11.2007 05:36
|
|
|
code: bachan@bugaga ~/zzz $ cat aaa
bla-bla-bla KEYWORD "id" bla-bla-bla
bla-bla-bla KEYWORD "id" bla-bla-bla
bla-bla-bla KEYWORD "id" bla-bla-bla
bla-bla-bla KEYWORD "id" bla-bla-bla
bachan@bugaga ~/zzz $ cat aaa | grep KEYWORD | sed 's/.*KEYWORD[^"]*"\([^"]*\)".*/\1/'
id
id
id
id
честно. =)
слэши перед скобками нужны:
code: $ info sed
The `s' Command
===============
The syntax of the `s' (as in substitute) command is
`s/REGEXP/REPLACEMENT/FLAGS'. The `/' characters may be uniformly
replaced by any other single character within any given `s' command.
The `/' character (or whatever other character is used in its stead)
can appear in the REGEXP or REPLACEMENT only if it is preceded by a `\'
character.
The `s' command is probably the most important in `sed' and has a
lot of different options. Its basic concept is simple: the `s' command
attempts to match the pattern space against the supplied REGEXP; if the
match is successful, then that portion of the pattern space which was
matched is replaced with REPLACEMENT.
The REPLACEMENT can contain `\N' (N being a number from 1 to 9,
inclusive) references, which refer to the portion of the match which is
contained between the Nth `\(' and its matching `\)'. Also, the
REPLACEMENT can contain unescaped `&' characters which reference the
whole matched portion of the pattern space. Finally, as a GNU `sed'
extension, you can include a special sequence made of a backslash and
one of the letters `L', `l', `U', `u', or `E'. The meaning is as
follows:
что касается ^$, вроде разницы нет. как ^.* может отличаться от .* в начале? ну и .*$ от .* в конце.
|
я АЭС фачил в эсс! |
|
Bachan
|
god's pee
|
|
|
|
Рег.: 26.10.2002
|
Сообщений: 37551
|
|
Рейтинг: 5335
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: mmCleric]
03.11.2007 05:37
|
|
|
> чтобы не печатать те строки, в которых KEYWORD почему-то отсутствует. он же написал, что делал grep KEYWORD. =)
|
я АЭС фачил в эсс! |
|
mmCleric
|
|
|
|
|
Рег.: 19.09.2004
|
Сообщений: 459
|
Из: Здесь
|
Рейтинг: 263
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Bachan]
03.11.2007 05:41
|
|
|
> он же написал, что делал grep KEYWORD. =) Угу, я угадать пытался, почему могло быть > твое печатает всю строку целиком. мое печатае только id.
|
-Ofun |
|
Bachan
|
god's pee
|
|
|
|
Рег.: 26.10.2002
|
Сообщений: 37551
|
|
Рейтинг: 5335
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Bachan]
03.11.2007 05:42
|
|
|
ладно, не спорю, KEYWORD мог оказаться не там еще при grep-е.
но не мог же он ПОСТОЯННО оказываться не там, что привело к тому, что sed ни для одной строки не нашел совпадений и вывел их все, как было.
|
я АЭС фачил в эсс! |
|
Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13749
|
Из: Москва
|
Рейтинг: 3476
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: Bachan]
03.11.2007 10:02
|
|
|
странно, но под виндой у меня sed одиночные кавычки '' не скушал. 
|
|
mk52
|
member
|
|
|
|
Рег.: 11.05.2007
|
Сообщений: 116
|
|
Рейтинг: 65
|
|
Re: [sed/awk/?]как выделить слово из строки, идущее после заданного сл
[re: mmCleric]
03.11.2007 14:47
|
|
|
Quote:
code: perl -nle '/KEYWORD\s+"(.*?)"/ and print $1' , а не тот ужас, который там выше написан.
хм а в чем ужас-то? в том чтот скрипт заменяетвсе эти cat | grep | sed ? или может быть non-greedy выражение лучше чем просто ([^"]+)?
кроме того реализаций sed'а не одна, а на перле если уж что-то работает, то работать будет везде.
|
|