sed - найти и заменить шаблон, но исключить определенную числовую последовательность

sed - найти и заменить шаблон, но исключить определенную числовую последовательность

Итак, я сделал следующее заявление:

echo "1234 The few, 7777 the brave." | sed 's/[0-9]\{4\}/(&)/g'

который выводит

(1234) The few, (7777) the brave.

Однако я хочу исключить 7777 из сопоставления с образцом.

(1234) The few, 7777 the brave.

вопрос: как исключить сопоставление с образцом 7777?

решение1

В sed нет выражений предпросмотра, которые позволили бы вам аккуратно пропустить 7777. Но вы можете сделать это неуклюже, переместив все совпадения 7777 «в сторону» в какую-то строку, которая, как вы уверены, не встречается нигде во входных данных.

Например, если вы знаете, что #7#7#7#7# не встречается во входных данных, вы можете использовать:

echo "1234 The few, 7777 the brave." | \
sed -e 's/7777/#7#7#7#7#/g' -e 's/[0-9]\{4\}/(&)/g' -e 's/#7#7#7#7#/7777/g'

получить

(1234) The few, 7777 the brave.

решение2

Альтернативно:

echo "1234 The few, 7777 the brave." | sed -e 's/\([0-9]\{4\}\)/(\1)/g' -e 's/(\(7\{4\}\))/\1/g'
(1234) The few, 7777 the brave.

echo "A 1717 B 7777 C 7676 D" | sed -e 's/\([0-9]\{4\}\)/(\1)/g' -e 's/(\(7\{4\}\))/\1/g'
A (1717) B 7777 C (7676) D

echo "7777 foo 1234 bar" | sed -e 's/\([0-9]\{4\}\)/(\1)/g' -e 's/(\(7\{4\}\))/\1/g'
7777 foo (1234) bar

Связанный контент