Управление текстовыми файлами Linux с помощью sed / awk - PullRequest
0 голосов
/ 20 января 2010

У меня есть список в следующем формате

77 Infinite Dust<br> 4 Illusion Dust<br> 12 Dream Shard<br> 29 Star's Sorrow

Мне нужно изменить это на:

77 <a href="http://www.wowhead.com/?search=Infinite Dust">Infinite Dust</a><br> 4 <a href="http://www.wowhead.com/?search=Illusion Dust">Illusion Dust</a><br> 12 <a href="http://www.wowhead.com/?search=Dream Shard">Dream Shard</a><br> 29 <a href="http://www.wowhead.com/?search=Star's Sorrow">Star's Sorrow</a>

Мне удалось вывести этот список в правильный формат, просто пропустив числа, используя:

sed 's|^[0-9]*.|<a href="http://www.wowhead.com/?search=|g' filename | sed 's|$|">|g' | sed 's#<a[ \t][ \t]*href[ \t]*=[ \t]*".*search=\([^"]*\)">#&\1</a>#'

Но я не могу понять, как заставить его хранить цифры перед списком, любая помощь приветствуется, спасибо!

Ответы [ 5 ]

3 голосов
/ 20 января 2010

Вы можете сделать это с помощью sed, отображая части линий в группы. в группах sed A и B в (A) - (B) совпадают с \ 1 и \ 2, с добавленной складкой, которую необходимо экранировать от "()": например

sed 's/\([0-9]*\)\ \(.*\)$/\1 -- \2/g' testfile

отображает числа до пробела в группу 1, а все последующие - в группу 2. Затем вы можете сопоставить группы 1 и 2 с любыми значениями - например, изменив замену sed на что-то вроде

 \1 <a href.....\2">\2</a>
2 голосов
/ 20 января 2010

Если бы вы сказали нам, что в конечном итоге пытались сделать в своем последнем вопросе , мы бы сказали вам гораздо более простой способ сделать это.

Как я уже сказал в моем ответе на ваш последний вопрос, вы можете sed запомнить часть шаблона и именовать эту часть как \1, \2 и т. Д.

Вам нужно запомнить номер и оставшуюся часть строки отдельно, поэтому шаблон выглядит следующим образом: \([0-9]*\) \(.*\): это, по сути, ноль больше цифр, затем пробел и любое количество символов.

Итак, ваша sed команда становится:

`sed -e 's|\([0-9]*\) \(.*\)|\1 <a href="http://www.wowhead.com/?search=\2">\2</a>|'

Эта команда делает все, что вы хотите, за один раз.

1 голос
/ 20 января 2010
awk '
{
    s=""
    for(i=2;i<NF;i++) s=s$i
    s=s" "$NF
    printf $1 "<a href=\"http://www.wowhead.com/?search="s
    print "\042>"s"</a>"

} ' file

выход

$ ./shell.sh
77<a href="http://www.wowhead.com/?search=Infinite Dust">Infinite Dust</a>
4<a href="http://www.wowhead.com/?search=Illusion Dust">Illusion Dust</a>
12<a href="http://www.wowhead.com/?search=Dream Shard">Dream Shard</a>
29<a href="http://www.wowhead.com/?search=Star's Sorrow">Star's Sorrow</a>
0 голосов
/ 20 января 2010

В sed вы можете использовать символ &, чтобы поместить соответствующий шаблон в тексте замены. Например:

эхо xyz | sed 's / ^ xyz / abc & /'

будет выводить

abc xyz

Итак, в вашем примере,

sed 's | ^ [0-9] *. | &

0 голосов
/ 20 января 2010

С awk это было бы что-то вроде:

{  
   rest = substr($0, length($1)+2, length($0));
   printf("%d <a href=\"http://www.wowhead.com/?search=%s\">%s</a>\n", $1, rest, rest); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...