Текст замены между скобками

Это кажется мне, Вы установили IDE с помощью конфетки и затем вошли в IDE для установки последних средств разработки Java. Если Вы устанавливаете Eclipse от системы управления пакета Вашего дистрибутива Linux, то необходимо установить средства разработки от этой системы также. Я уверен, что в конфетке существует пакет затмения-jdt. Зависимость, вероятно, от затмения-jdt до затмения, которое было сознательным решением, поскольку реверс является дополнительным.

Существует два решения, или придерживаются пакетов от Вашего IDE или загружают архив с веб-сайта затмения. Первая опция обеспечит стабильную среду, где все части сотрудничают приятно. Второе даст Вам последнюю (стабильную) версию всего, и Вы испытаете меньше затруднений из-за конфликтов как это, когда Вы добавите/установите компоненты изнутри IDE.

2
24.10.2012, 19:33
4 ответа

Должен это быть awk? Намного легче на других языках, где сменная деталь замены может быть вызовом функции. Например, perl:

perl -pe 'sub c{$s=shift;$s=~s/BAR|WIBBLE|ME/FOO/g;$s}s/\[.*?\]/c$&/ge' 
5
27.01.2020, 21:53
  • 1
    Спасибо! Это сделало это. @choroba и @Guru граница слова были бы большими также, но я хочу быть устойчивым в какой текст SOMETHING должен быть. Я обновлю вопрос сделать это более ясным. –  Chris 24.10.2012, 19:30

С GNU awk Вы может установить RS к содержанию скобок и затем делают замену на RT (подобранный разделитель записей):

awk -v RS='\\[[^]]*\\]' '{ gsub(/\<(BAR|WIBBLE|ME)\>/, "FOO", RT); printf "%s%s", $0, RT }' infile

infile:

cat << EOF > infile
SHE GAVE ME THAT
SOMETHING [ME, WIBBLE, SOMMER]
EOF

вывод:

SHE GAVE ME THAT
SOMETHING [FOO, FOO, SOMMER]
3
27.01.2020, 21:53
  • 1
    +12. Тот прием RT является злым! хороший –  Stéphane Chazelas 01.02.2013, 18:04

Awk испытывает недостаток в обратных ссылках в заменах регулярного выражения, таким образом, он не может легко сделать замен в контексте. Sed может сделать это:

sed -e 's/\(\[[^]]*\)BAR/\1FOO/' 's/\(\[[^]]*\)ME/\1FOO/'

Если Ваш sed поддерживает чередование в regexps:

sed -e 's/\(\[[^]]*\)\(BAR\|ME\)/\1FOO/'

Это только обрабатывает единственную замену в каждой паре скобки, даже с g суффикс, потому что [^]]* соответствует самой длинной последовательности без закрывающих квадратных скобок. Для замены всех их используйте явный цикл; обратите внимание, что это только работает если FOO не подстрока BAR или ME.

sed -e ': a' -e 's/\(\[[^]]*\)BAR/\1FOO/' -e 't a' \
             -e 's/\(\[[^]]*\)ME/\1FOO/' -e 't a'

При необходимости в чем-то более сложном используйте жемчуг.

2
27.01.2020, 21:53
awk '{ gsub(/\bBAR\b|\bWIBBLE\b|\bME\b/, "FOO"); print }'
-3
27.01.2020, 21:53

Теги

Похожие вопросы