Intereting Posts
Как загружать Firefox Sync на многих машинах? Как установить evince на выпуск CentOS Linux 7.0.1406 Как chroot предоставить новую версию glibc для приложения? объединение опций в команде find из буквы в другую Несколько сообщений «-bash command not found» в Mac OS X Snow Leopard Unix Есть ли дистрибутив linux, который использует звуковой сервер Jack все время? Скопируйте только обычные файлы из одного каталога в другой Уведомление рабочего стола Как я могу получить SQL-запросы для отображения в выходном файле? команда, которая работает как символ ~ (тильда) для представления некоторого каталога Не удалось создать каталог конфигурации для . Установите переменную $ XDG_CONFIG_HOME Невозможно добавить PPA, застрял в gpg: keybox переменная alter awk, основанная на совпадении внутри awk Является ли архивирование всей файловой системы из корня эффективной стратегией резервного копирования? Как установить mercurial на openSUSE?

Как использовать sed для замены двух экземпляров одинаковых цифр, разделенных косой чертой, на один экземпляр этих цифр?

Я хочу использовать sed для замены двух экземпляров одинаковых цифр, разделенных косой чертой, на один экземпляр этих цифр. Мои входные файлы имеют такие строки:

 text (1982/1982) text text (1983/1983) text text (1984/1984) text 

Я хочу вывод, как это:

 text (1982) text text (1983) text text (1984) text 

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

В BBEdit я могу сделать это с помощью шаблона поиска \(([0-9]{4})/\1\) и шаблона замены \(\1\) . Но в sed эквивалентные расширенные регулярные выражения, похоже, не работают:

 echo 'text (1984/1984) text' | sed -E 's_\(([0-9]{4})/\1\)_\(\1\)_g' 

возвращает:

 text (1984/1984) text 

но вместо этого я хочу:

 text (1984) text 

Какие расширенные регулярные выражения будут делать это в sed ?

Я использую встроенный sed в MacOS.

Версия OSX sed довольно раздражает (на самом деле это версия BSD). Я обычно устанавливаю GNU sed через brew:

 $ brew search sed ==> Formulae gnu-sed ✔ libxdg-basedir minised ssed ==> Casks eclipse-dsl marsedit exoduseden microsoft-bing-ads-editor focused osxfuse-dev google-adwords-editor physicseditor lego-mindstorms-education-ev3 prefs-editor licensed subclassed-mnemosyne 

Установите это:

 $ brew install gnu-sed 

Затем вы можете использовать его так:

 $ gsed .... 

И вуаля, ваш пример сейчас работает:

 $ echo 'text (1984/1984) text' | sed -E 's_\(([0-9]{4})/\1\)_\(\1\)_g' text (1984/1984) text $ echo 'text (1984/1984) text' | gsed -E 's_\(([0-9]{4})/\1\)_\(\1\)_g' text (1984) text 

Рекомендации

  • Различия между sed на Mac OSX и другими «стандартными» sed?