2014-01-27 5 views
1

Есть ли способ заменить несколько захваченных групп и заменить его значением из захваченных групп из формата ключа (с разделителем =) в sed?Множественная замена в sed

К сожалению, этот вопрос сбивает с толку, так вот пример

Что у меня есть:

aaa="src is $src$ user is $user$!" src="over there" user="jason" 

То, что я хочу, в конце концов:

aaa="src is over there user is jason!" 

Я не хочу hardcode - позиция $var$, потому что они могут измениться.

+2

'Sed' является неправильным инструментом для выполнения этой задачи. В нем не хватает многих данных и структур управления наиболее мощных языков. – Birei

+0

Итак, я думаю, мне все равно придется делать эту задачу программно. – hobbes3

+0

sed создает для такого рода задачи. Не самый простой, но все же относительно легкий. – NeronLeVelu

ответ

1
sed ':again 
s/\$\([[:alnum:]]\{1,\}\)\$\(.*\) \1="\([^"]*\)"/\3\2/g 
t again 
' YourFile 

Как вы видите, sed абсолютно не интересен, делая такую ​​задачу ... даже с элементом на нескольких строках он может работать с небольшими изменениями, и ему не нужна быстрая грязная 6 сложная линия более мощных языков.

Principe:

  1. создать ярлык (для Futur Goto)
  2. поиск в вхождение в patterne между $ $ и взять его ассоциировать содержание и заменить шаблон с ней и следующей строкой, но без рисунка определение содержимого
  3. Если это произойдет, попробуйте еще раз, перезапустив ссылку на ярлык скрипта. Если не печатать и обрабатывать следующую строку
+0

Почему в 't again' должен быть разрыв строки? Я пытался сделать все в одной строке, и это не сработало. – hobbes3

+0

зависит от версии sed, я думаю, некоторые работы над GNU sed. Причина заключается в том, что соглашение о ярлыке должно заканчиваться на линии; похоже, не работает как конец строки в этом случае. возможно, формат для использования, например, пространство до и/или после. Я должен проверить страницу oneliner, чтобы увидеть, работает ли какой-либо рефлектометр на posix sed – NeronLeVelu

1

Это быстрый способ устранения проблемы с использованием . Это может потерпеть неудачу в каком-то смысле (пробелы, сбегает двойные кавычки, ...), но было бы получить работу в самых простых случаях:

perl -ne ' 
    ## Get each key and value. 
    @captures = m/(\S+)=("[^"]+")/g; 

    ## Extract first two elements as in the original string. 
    $output = join q|=|, splice @captures, 0, 2; 

    ## Use a hash for a better look-up, and remove double quotes 
    ## from values. 
    %replacements = @captures; 
    %replacements = map { $_ => substr $replacements{$_}, 1, -1 } keys %replacements; 

    ## Use a regex to look-up into the hash for the replacements strings. 
    $output =~ s/\$([^\$]+)\$/$replacements{$1}/g; 

    printf qq|%s\n|, $output; 
' infile 

Это дает:

aaa="src is over there user is jason!" 
Смежные вопросы