【问题标题】:Linux/Unix Replacing a pattern in a string and saving to a new file with sedLinux/Unix 替换字符串中的模式并使用 sed 保存到新文件
【发布时间】:2015-03-18 14:31:23
【问题描述】:

我有一个任务,要替换字符串中的特定模式。 到目前为止,我尝试过像sed -e 's/text_to_find/text_to_replace/g' file 这样的命令 但我不知道为什么它改变了所有字符串,而不仅仅是我想改变的部分。

我想做的是在每个包含单词china的字符串中添加这个Tomas_proxy.lt

为了说清楚,我在寻找什么,我正在使用一个文件:

987173,businesswirechina.com
988254,chinacfa.com
988808,1012china.com
989146,chinawise.ru
989561,chinaretailnews.com
989817,mobileinchina.cn
990894,cmt-china.com.cn
990965,chinajoy.net
992753,octaviachina.com
993238,chinadftzalex.com
993447,china-kena.com

这是我想在新文件中看到的

987173,Tomas_proxy.lt/businesswirechina.com
988254,Tomas_proxy.lt/chinacfa.com
988808,Tomas_proxy.lt/1012china.com
989146,Tomas_proxy.lt/chinawise.ru
989561,Tomas_proxy.lt/chinaretailnews.com
989817,Tomas_proxy.lt/mobileinchina.cn
990894,Tomas_proxy.lt/cmt-china.com.cn
990965,Tomas_proxy.lt/chinajoy.net
992753,Tomas_proxy.lt/octaviachina.com
993238,Tomas_proxy.lt/chinadftzalex.com
993447,Tomas_proxy.lt/china-kena.com

附:这只是示例文件,在我使用的真实文件中,并非每一行都有单词 china ,有 100000 个字符串,可以说大约 500 个有 china

【问题讨论】:

    标签: linux design-patterns sed


    【解决方案1】:

    你可以试试这个sed 命令

    sed 's/,\(.*china\)/,Tomas_proxy.lt\/\1/' FileName
    

    sed 's/,\(.*china\)/,Tomas_proxy.lt\/\1/' FileName > NewFile
    

    sed  -i.bak 's/,\(.*china\)/,Tomas_proxy.lt\/\1/' FileName 
    

    【讨论】:

    • 在我尝试这个之前,它会保存对新文件的更改吗?
    • 您必须将输出重定向到新文件,或者您可以使用 -i 选项更改当前文件。查看我更新的答案。
    • 您能否更新您的答案以阐明每个命令的确切行为?这三个做的事情完全一样吗?
    【解决方案2】:
    sed '/[Cc]hina/s/,/,Tomas_proxy.lt\//' File > New_File
    

    在与china / China 匹配的所有行中(如果您不想进行大小写检查,请更改),将第一个, 替换为,Tomas_proxy.lt/。输出重定向到New_File

    如果您希望更改在同一个文件中,请使用-i(就地选项):

    sed -i '/[Cc]hina/s/,/,Tomas_proxy.lt\//' File
    

    【讨论】:

    • 能否请您稍微解释一下,如果我理解正确的话,[Cc]hina 用于中国和中国,s/, 用于分隔符-不确定,接下来,为什么在这个命令的结尾有双//
    • 如果我问你,一步一步地为新手解释一下。 ? :) 告诉我是否错了[Cc]hina 来自中国和中国s/, 来查找要搜索的分隔符。 ?我不太确定这个命令的开头,主要是/s/,/,这部分,谢谢你帮助我。
    • 好的。 :-) 。 1) [Ch]ina => "China" / "china"。 2) 替换的一般格式是 sed 's/pattern_tobe_replaced/new_pattern/'。另一种格式是 sed '/pattern_present/s/pattern_tobe_replaced/new_pattern/' 只有当行中有“pattern_present”时才会发生替换。这是我们在这里使用的格式。如果 [Cc]hina 存在,则进行替换。将 "," 替换为 ",Tomas_proxy.lt/"。可以从一般模式中弄清楚。转义“Tomas_proxy.lt/”中的“/”=>“Tomas_proxy.lt\/”。有关“sed”的更多信息:grymoire.com/Unix/Sed.html。希望它有所帮助.. 呼..我累了 :D :D
    【解决方案3】:

    她是awk版本:

    awk '/china/ {sub(/,/,"&Tomas_proxy.lt/")} 1' file
    987173,Tomas_proxy.lt/businesswirechina.com
    988254,Tomas_proxy.lt/chinacfa.com
    988808,Tomas_proxy.lt/1012china.com
    989146,Tomas_proxy.lt/chinawise.ru
    989561,Tomas_proxy.lt/chinaretailnews.com
    989817,Tomas_proxy.lt/mobileinchina.cn
    990894,Tomas_proxy.lt/cmt-china.com.cn
    990965,Tomas_proxy.lt/chinajoy.net
    992753,Tomas_proxy.lt/octaviachina.com
    993238,Tomas_proxy.lt/chinadftzalex.com
    993447,Tomas_proxy.lt/china-kena.com
    

    搜索china,如果找到,将,替换为,Tomas_proxy.lt/,然后打印所有行。

    【讨论】:

      【解决方案4】:
      sed '/china/ s#,#,Tomas_proxy.lt/#' YourFile
      

      根据您的示例并假设第一个 , 是在该行中插入文本的位置

      【讨论】:

        猜你喜欢
        • 2016-05-01
        • 2017-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-07
        • 2012-11-28
        • 1970-01-01
        • 2022-01-17
        相关资源
        最近更新 更多