2016-12-25 1 views
0

Я пытался сделать замену sed. По какой-то причине, я просто не могу моя голова вокруг СЭД и регулярные выражения (это мой второй вопрос СЕПГ)Найдите замену строки до и после

В основном я хочу найти текст и заменить затем найти следующее вхождение некоторого текста и заменить, что

до сих пор я это

echo "This could be anywhere and this bit should be changed \$\{hcvar-BookName\} and this would remain" | sed 's/$\\{hcvar-/" + hcvar-/g' 

Это возвращает:

*This could be anywhere and this bit should be changed " + hcvar-BookName\} and this would remain* 

Однако я хочу вернуться

*This could be anywhere and this bit should be changed " + hcvar-BookName + " and this would remain* 

Это заменит} с + "

логика будет что-то вроде:

Find: \$\{hcvar- 
Replace with: " + hcvar- 
Then find the next occurrence of: \} 
Replace with: + " 

второй бит для замены будет сразу после строки, которая содержит: hcvar-

Это должно работать для следующих примеров струн.

  • Это может быть где угодно, и этот бит должен быть изменен \ $ {hcvar-BookName}, и это останется
  • Это может быть в любом месте и этот бит должен быть изменен \ $ {hcvar-somethingelse}, и это будет оставаться
  • Это может быть где угодно, и этот бит должен быть изменен
    \ $ {hcvar-wouldnevercontainspaces}, и это останется

Любая помощь будет оценена.

ответ

0

Вам нужно бежать $ с помощью обратной косой черты:

echo "This could be anywhere and this bit should be changed \$\{hcvar-BookName\} and this would remain" | sed -e 's/\$\\{hcvar-/" + hcvar-/g' -e 's/\\}/ +/'

Выход:

This could be anywhere and this bit should be changed " + hcvar-BookName + and this would remain

+0

В POSIX СЭД '$' является литеральным, если это не последний символ в части 'pattern' команды substitute. Однако во многих вариантах '' 'не будет буквальным, если это последний логический символ, то есть:' s/\ (a \ | $ \)/b/'заменит' a' или нулевой байт после того, как пространство с шаблоном ' b'. – andlrc

1

Предполагая, что ваш вклад в действительности:

... changed ${hcvar-BookName} and ... 

Тогда следующая будет работать:

$ sed 's/${\([^}]*\)}/" + \1 + "/' file.txt 
This could be anywhere and this bit should be changed " + hcvar-BookName + " and this would remain 

использование Примечание одиночные кавычки, чтобы сохранить то, что иначе было бы специальные символы для оболочки:

$ echo '...changed ${hcvar-BookName} and ...' | sed '...' 

Если вход реально используется \{ I.е: ... $\{hello\} ..., то это может работать:

$ sed 's/$\\{\([^}]*\)\\}/" + \1 + "/' file.txt 
This could be anywhere and this bit should be changed " + hcvar-BookName + " and this would remain 

Разбивка:

s/   /  /# Replace ... with ... 
    ${   }    # Literal ${ and literal } 
    \( \)    # \(and \) is a capturing group 
     [^}]*    # Match everything but } zero or more times 
       " + \1 + " # \1 will be expanded to the captured result 
          # from \(, \). The rest is literal 

Добавьте g ЛОБАЛЬНЫЕ, если вам нужно умножить замены в каждой строке:

s/pattern/replacement/g 
#     ^Global flag 

 Смежные вопросы

  • Нет связанных вопросов^_^