regex
  • linux
  • bash
  • command-line
  • sed
  • 2013-12-19 47 views 0 likes 
    0

    替换线我有这样一句台词:与SED但保持原线

    param1='123' 
    

    我想以下几点:

    param1='123' 
    param2=123 
    

    哪里123可以是任意值。

    我可以用得到param2

    sed -i "s/param1=\([0-9]\+\)/param2='\1'/g" '{}' \; 
    

    但随后我就失去param1

    我也可以用附加线param2

    sed -i "param1='\([0-9]\+\)';/a \param2=\1;" 
    

    但是这种模式并不认可,我结束了param2=1

    有没有办法这两个命令或工作的另一种方式结合起来这个?

    +0

    将'sed'内联脚本封装在单引号中通常会更好。那么你不必担心是否与shell的cmd行处理有任何交互。如果您需要传递一个shell变量并将其扩展(仅作为一般规则,但不是硬性规则),则仅对sed内联脚本使用dbl-quotes。祝你好运。 – shellter

    +0

    谢谢你的庇护所。我用了双引号,因为我不希望单引号干扰123周围的单引号。也许我可以用'123 \' – user1792403

    +0

    转义,对不起,我错过了你的模式。我不认为'......''123''''会起作用。但是你可以使用各种引用方法,即''''''123'''....''。祝你好运。 – shellter

    回答

    1

    你可以说:

    sed -r "s/(param1='([^']*)')/\1\nparam2=\2/" filename 
    

    (添加-i选择就地编辑。)

    +0

    这与'-r'选项一起工作,但是如果我将'-r'更改为'-i',则's命令的RHS'中出现sed:-e表达式#1,字符35:无效引用\ 2的错误'或'-e' – user1792403

    2

    给人一种扩展,-i标志创建一个备份,以便foo.ini将被更新和原始未修改版本会被发现foo.ini.bak

    $ find . -name '*ini' -exec sed -ri.bak 's/param1=.([0-9]+)./&\nparam2=\1/' {} \; 
    

    sed命令g标志可能是多余的,因为在Unix配置文件中,单个行中设置了单个选项。该命令将param1=123替换为param1=123\nparam2=123,因为&代表整个比赛,值123在第一个捕获组中捕获。

    &  # Whole match 
    \n  # Newline character 
    param2= # Literal string 
    \1  # First capture group 
    

    所以基本上这条线是重复的,但是选项被改变并且值保持不变。

    +0

    谢谢你的回答,我会在第二时间尝试。请注意我并不是指单参数在param2中,这是否会改变你的答案?我编辑了问题 – user1792403

    +0

    @ user1792403我的错误,我认为这是你的一个遗漏。我已经更新了我的答案以反映这一点。 –

    +0

    这似乎有点复杂,我对sed很新。但+1,因为它看起来令人兴奋,当我更好地理解事情时,我会回来看看这个 – user1792403

    1

    这可能为你工作(GNU SED):

    sed "p;s/1='\([^']*\)'.*/2=\1/" file 
    
    -1

    sed -i "s/\(param1='\([0-9]\+\)'\)/\1\nparam2=\2/g"

    似乎工作。

    与devnull的回答类似,但没有使用-r(需要在不使用扩展正则表达式时在括号之前添加反斜杠)。

    相关问题