LINUX.ORG.RU

Bash и фигурные скобки


0

1

Нужно проводить манипуляции с выражениями типа «[A-Z][A-Z] [0-9]*», например, в «FR 1234567», «US 1234567», «UK 1234567» заменить FR/US/UK на NO или вставить неразрывный пробел вместо обычного.

Почему не работает следующее выражение?

pattern="FR 1234567"
echo "$pattern"|sed "s/{US,FR,UK}/NO/g"

Deleted

Ответ на: комментарий от sdio

Я уже убил сегодня где-то полтора часа на bash. Предлагаете мне весь оставшийся день man читать?

Deleted
()
Ответ на: комментарий от anonymous

В фигурных скобках в regex указывается количество повторений символа, а не варианты.

$ echo "aaabbaabba" | sed -r "s/a{2}/c/g"
cabbcbba

x-signal ★★
()
Ответ на: комментарий от x-signal

А как указать варианты?

line="what is claimed are" 
pattern="what is claimed {is,are}" (??)
echo "$line"|grep "$pattern"

В квадратных скобках срабатывает только если указывать по одной букве.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от x-signal

А почему тогда следующее не работает?

#"всего 19 стр."
#"всего 19 с,"
pattern="всего \([0-9]*\) стр\|с\([.,]\)
line=`echo "$line"|sed "s/$pattern/\1 pages in total\2/g"`

всего 19 стр.

19 pages in total.

всего 19 с,

всего 19  pages in total,

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Приоритет операторов надо поправить () и задать поиск целых слов <>:

pattern="всего \([0-9]*\) \(\<стр\>\|\<с\>\([.,]\)\)"
line=`echo "$line"|sed "s/$pattern/\1 pages in total\3/g"`

x-signal ★★
()
Ответ на: комментарий от x-signal

Почему не sed -r вместо ректального эскейпа? Где вы находите такие кастрированные утилиты?

anonymous
()
Ответ на: комментарий от x-signal

Я, честно говоря, не осилил поставить там приоритет, потому что вижу только один оператор - «|». А приведенный вами код выдает

19 pages in totalстр.
19 pages in totalс,

Deleted
()
Ответ на: комментарий от Deleted

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

Да, так и есть. Поэтому вернее было бы сказать не приоритет, а группировка. Без скобок sed считает всё, что слева от «|» первым вариантом, а на второй остаётся только «с\([.,]», поэтому пролезала строка «всего 19» - она просто не попадала под шаблон для замены. Кстати, как тут верно советовал anonymous, можно сильно упростить шаблон, если sed поддерживает ключ -r:

pattern="всего ([0-9]*) (<стр>|<с>([.,]))"

x-signal ★★
()
Ответ на: комментарий от x-signal

Спасибо за разъяснения! Вы очень помогли.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.