【问题标题】:replace line in file with sed command用 sed 命令替换文件中的行
【发布时间】:2013-09-25 17:15:17
【问题描述】:

我有这个脚本:

#!/bin/sh
local name="url"
local line='{ "name": "url", "value": "http:\/\/www.example.com\/dir1\/page1" }'

local name2="protocol"
local line2='{ "name": "protocol", "value": "ftp" }'

sed -i "/\<$name2\>/s/.*/$line2/" /mydir/myfile
sed -i "/\<$name\>/s/.*/$line/" /mydir/myfile

我的文件包含:

{ "name": "url", "value": "http:\/\/www.example.com\/dir2\/page2" }
{ "name": "url2", "value": "http:\/\/www.example.net/page" }
{ "name": "protocol", "value": "http" }

我使用 sed 命令在值字段中检测到 / 符号存在问题。如何解决此错误?

【问题讨论】:

    标签: linux bash sed sh


    【解决方案1】:

    像这样使用不同的分隔符:

    sed -i "/\<$name2\>/s%.*%$line2%" /mydir/myfile
    

    例如,这是我刚刚做的一个转储:

    printf "eins x eins\nzwei x zwei\nabc x abc\ndef x def\n" | sed "/abc/s%x%y%"
    

    打印出来:

    eins x eins
    zwei x zwei
    abc y abc
    def x def
    

    如您所见,只有包含abc 的行被s 命令修改。

    除了% 符号,您可以使用任何字符您要替换的值中没有出现。记住这一点。您也可以使用_; 或字母、数字,无论您喜欢什么。它只是不能出现在值中。

    【讨论】:

      【解决方案2】:

      由于您的文件到处都有/,因此最好使用备用正则表达式分隔符;它由 sed 支持。

      sed -i "/\<$name2\>/s|.*|$line2|" /mydir/myfile
      sed -i "/\<$name\>/s|.*|$line|" /mydir/myfile
      

      【讨论】:

      • 问题我有其他值比如ftp|http,这种情况下怎么办?
      • 您可以使用:sed -i "/&lt;$name2\&gt;/s~.*~$line2~" /mydir/myfile,正如我所说的,任何字符都可以工作,甚至可以控制字符。
      • 我能否找到另一个命令来执行此操作,与我的值内容和名称无关
      猜你喜欢
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 2022-01-10
      • 2014-03-28
      相关资源
      最近更新 更多