在sed中多次更换

时间:2014-01-27 23:24:56

标签: regex sed

是否有办法替换多个捕获的组,并将其替换为=中键值格式(由sed分隔)的捕获组的

抱歉,这个问题令人困惑,所以这里有一个例子

我有什么:

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

最终我想要的是什么:

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

我不想硬编码$var$的位置,因为它们可能会改变。

2 个答案:

答案 0 :(得分: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!"

答案 1 :(得分:1)

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

如你所见,sed绝对没有兴趣做这种任务......即使在几行上使用元素,它也可以进行少量修改,并且它不需要快速一个较为复杂的高级语言的复杂系列。 / p>

普林西:

  1. 创建一个标签(for futur goto)
  2. 在$ $之间搜索patterne的出现并获取他的关联内容并用它替换模式并跟随字符串但没有模式内容定义
  3. 如果发生,请通过重新启动脚本的标签引用再次尝试。如果不打印并处理下一行