LinuxForum.Fans
Тема

Помогите с заменой слова в строке...

Автор: DECAL 7 сообщений 4064 просмотров
#261433

Пишу скрипт и я не могу сообразить как поменять третье слово (150000) на "1" в строке:

text
#l# 1284725281 150000

учитывая, что третье слово может быть разной длиной, а второе всегда одинаковой, но с разными цифрами

Я примерно вот так начал писать, а дальше не соображу:

text
sed 's/^#l#\ [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\ /#l#\ "вот тут уже не соображу"' ahistory.dat
#261438

sed -r 's/(#l# [0-9]{10}) [0-9]+/\1 1/'

#261445
Fat-Zer написал:
sed -r 's/(#l# [0-9]{10}) [0-9]+/\1 1/'

Объясни если можно, что эта строка значит...
Я так понял:
-r - включить использование регулярных выражений
s/(#l# [0-9]{10}) [0-9]+ - заменить #l# и десять разных цифр и одну любую цифру или больше на ... а вот дальше не понял почему \1 1/

#261457
"DECAL" написал:
Объясни если можно, что эта строка значит...Я так понял: -r   -   включить использование регулярных выражений

расширенных регулярных выражений - не надо ставить тучу слешей перед скобками... да, ЕМНИП это расширение гнутой версии...

"DECAL" написал:
s/(#l# [0-9]{10}) [0-9]+   -   заменить #l# и десять разных цифр и одну любую цифру или больше на ...

да, всё так.

"DECAL" написал:
а вот дальше не понял почему \1 1/

\1 - ссылка на выражение в первых круглых скобках, т.е. на то, что соответствовало '(#l# [0-9]{10})' в исходной строке.

#261511

если третье слово последнее и после него нет пробелов, то можно проще
sed 's/[^ ]*$/1/'

#261516

[console]
lupo@gentoo-laptop /tmp % cat test.txt [gentoo-laptop][22:51]
#l# 1284725281 150000
lupo@gentoo-laptop /tmp % awk '{print $3" "$2" "$1}' test.txt [gentoo-laptop][22:52]
150000 1284725281 #l#
[/console]

#261577

Всем большое спасибо, особенно Fat-Zer, тему считаю закрытой...

Войдите или зарегистрируйтесь, чтобы ответить.