Автор Тема: bash / Условия и регулярные выражения  (Прочитано 1384 раз)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 145
    • Email
Всем привет!

Условие.
В общем затык с таким условием:
условие1 ИЛИ (условие2 И условие3)

Рег. выражение.
Как можно обработать фамилии, у меня подряд читаются фамилии, если следующая фамилия совпадает с предыдущей, то нужно выполнять некоторое действие. Проблема в том, что я не могу просто сравнить фамилии, потому они отличаются (Ж/М) окончаниями. Чего-то не могу ничего придумать...
Для примера:
Иванов
Иванова
Савиновских
Савиновский
Савиновская
Карпенко
Карпенко
должно быть так, например:
1.Иванов
1.Иванова
2.Савиновских
3.Савиновский
3.Савиновская
4.Карпенко
4.Карпенко

PS. Привёл слишком сложный вариант с окончаниями почти похожих фамилий, в реальности такое маловероятно.
Сноси Винду, переходи на Линукс ! :)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 145
    • Email
С условием вроде разобрался:
[[ условие1 || (( условие2 && условие3 )) ]]
Ещё с sed такой вопрос.
Есть такой файл:
99
99
99
Как заменить только последнюю 99 ?
Вот так все заменяется:
sed -i '/99/ s/^.*$/test/' test
UPD:
sed -i '$ s/^.*$/test/' test
« Последнее редактирование: 07.09.2015 07:43:01 от berkut_174 »
Сноси Винду, переходи на Линукс ! :)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 145
    • Email
Про окончания вот такое решение нашёл:
name1=Иванова
name2=Иванов
if [[ ${name1%%а} == ${name2%%а} ]]; then
...
Осталось ещё для -ая/-ий наладить... может ещё какие-то окончания есть... надо подумать...
Сноси Винду, переходи на Линукс ! :)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 145
    • Email
Вроде бы совсем разобрался, осталось только придумать как написать для нескольких окончаний...
Вот такие попались на глаза:
-/а
ой/ая
ий/ая
ый/ая
У кого-то есть мысли на этот счёт ?
Сноси Винду, переходи на Линукс ! :)

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 950
Вроде бы совсем разобрался, осталось только придумать как написать для нескольких окончаний...
Вот такие попались на глаза:
-/а
ой/ая
ий/ая
ый/ая
У кого-то есть мысли на этот счёт ?

да просто в лоб... если быстродействие не нужно
сравнить конец слова с этими окончаниями окончаниями и отделить начало, сравнить со следующим начало и все окончания :)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 145
    • Email
да просто в лоб... если быстродействие не нужно
sn_old=`sed ...`
sn=Иванова
for i in а ая ий ой ый; do
   sn=${sn%%$i}
   sn_old=${sn_old%%$i}
done
вот так сделал :)
« Последнее редактирование: 07.09.2015 12:26:20 от berkut_174 »
Сноси Винду, переходи на Линукс ! :)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 145
    • Email
Подскажите с sed...

Нужно заменить строку в кавычках:

param1='value1'
на

param1='new_value1'
Делаю:

sed -i "s|'.*'|'new_value1'|"
Но как именно исключить кавычки (') из замены ? Сейчас выдирается с ними, поэтому приходится в новом значении их же перечислять.
Сноси Винду, переходи на Линукс ! :)

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 145
    • Email
То есть хочется в паттерне указать эти кавычки, но заменить только значение внутри них, сами кавычки заменять не нужно.
Как сказать sed сделать именно так, не могу понять...
Сноси Винду, переходи на Линукс ! :)

Оффлайн sb

  • Модератор глобальный
  • *****
  • Сообщений: 8 991
Может тему в разработку (всё же более подходящий раздел - там и о программировании) ?

Оффлайн Антон Мидюков

  • alt linux team
  • ***
  • Сообщений: 5 183
  • antohami@
То есть хочется в паттерне указать эти кавычки, но заменить только значение внутри них, сами кавычки заменять не нужно.
Как сказать sed сделать именно так, не могу понять...

Странное у вас пожелание... Может вам нужно нечто подобное:
Замена "foo" на "bar" ТОЛЬКО для строк содержащих "baz":

sed '/baz/s/foo/bar/g'

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Как я понял - надо заменить 'f u u' на 'b a r' , но только если в кавычках, а простое f u u  не надо менять, как и 'f u u    ++ '

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 145
    • Email
Странное у вас пожелание...
http://php.net/manual/ru/regexp.reference.assertions.php

echo preg_replace( "/(?<=')\w+(?=')/", 'new_value1', "param1='value1'" ) . "\n";
sed так могёт ?

Чисто спортивный интерес...
Сноси Винду, переходи на Линукс ! :)

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
$ cat sedtest.txt
'hang'
$ sed -i -e "s/'hang'/'hand'/" sedtest.txt
$ cat sedtest.txt
'hand'
$ sed -i 's/'''hand'''/'hang'''/' sedtest.txt
$ cat sedtest.txt
'hang'
$ sed -i 's/'\'hang\''/'\'hand\''/' sedtest.txt
$ cat sedtest.txt
'hand'

Оффлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 145
    • Email
Speccyfighter

Смысл в том, чтобы описать кавы только в паттерне. Я же вижу только варианты, когда и в реплейсе они есть.
Сноси Винду, переходи на Линукс ! :)