Перечислять замены с помощью sed или awk - PullRequest
3 голосов
/ 19 мая 2009

Учитывая простой текстовый файл со строками

bli foo bla
 abc
 dfg
bli foo bla
 hik
 lmn

что такое sed или awk magic превращает его в

bli foo_01 bla
 abc
 dfg
bli foo_02 bla
 hik
 lmn

так, чтобы каждый случай 'foo' заменялся на 'foo_ [номер случая]'.

Ответы [ 3 ]

2 голосов
/ 19 мая 2009
awk '!/foo/||sub(/foo/,"&_"++_)' infile

Использование gawk , nawk или / usr / xpg4 / bin / awk на Solaris .

1 голос
/ 19 мая 2009

Возможно, это не то, что вам нужно, но это может дать некоторые идеи в правильном направлении.

Administrator@snadbox3 ~
$ cd c:/tmp

Administrator@snadbox3 /cygdrive/c/tmp
$ cat <<-eof >foo.txt
> foo
>  abc
>  dfg
> foo
>  hik
>  lmn
> eof

Administrator@snadbox3 /cygdrive/c/tmp
$ awk '/^foo$/{++fooCount; print($0 "_" fooCount);} /^ /{print}' foo.txt
foo_1
 abc
 dfg
foo_2
 hik
 lmn

EDIT:

Я опоздал на день и снова на пенни; - (


РЕДАКТИРОВАТЬ2:

Кодировка символов - это еще одна вещь, которую нужно искать ... Исходный код Java не обязательно находится в кодировке системы по умолчанию ... он выходит из кодировки UTF-8, чтобы разрешить любые встроенные "объекты более высокого порядка" ;-) Многие * Утилиты nix по-прежнему не поддерживают кодировки.

0 голосов
/ 19 мая 2009

Это еще один способ выразить ответ Радулова

awk '/foo/ {sub(/foo/, "&_" sprintf("%02d",++c))} 1' infile

Вы должны позаботиться о том, чтобы вы не соответствовали "foobar" при поиске "foo":

gawk '/\<foo\>/ {sub(/\<foo\>/, "&_" sprintf("%02d",++c))} 1' 
...