Перечислять замены с помощью sed или awk
-
22-08-2019 - |
Вопрос
Дан обычный текстовый файл со строками
bli foo bla
abc
dfg
bli foo bla
hik
lmn
во что магия sed или awk превращает это
bli foo_01 bla
abc
dfg
bli foo_02 bla
hik
lmn
так что каждое вхождение 'foo' заменяется на 'foo_[номер вхождения]'.
Решение
Это еще один способ выразить ответ радулова
awk '/foo/ {sub(/foo/, "&_" sprintf("%02d",++c))} 1' infile
Вам следует позаботиться о том, чтобы при поиске "foo" не совпадало с "foobar":
gawk '/\<foo\>/ {sub(/\<foo\>/, "&_" sprintf("%02d",++c))} 1'
Другие советы
awk '!/foo/||sub(/foo/,"&_"++_)' infile
Использование поглазеть, наукообразный или /usr/xpg4/bin/awk на Солярис.
Вероятно, это не то, что вам требуется, но это может дать некоторые идеи в правильном направлении.
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
Редактировать:
Я снова опоздал на день и у меня не хватает пенни ;-(
РЕДАКТИРОВАТЬ 2:
Кодировки символов - это еще одна вещь, на которую следует обратить внимание...Исходный код Java не обязательно находится в системной кодировке по умолчанию...он не закодирован в UTF-8, чтобы разрешить любые встроенные "объекты более высокого порядка" ;-) Многие утилиты * nix по-прежнему не поддерживают кодировку.