Linux/Unix 替换字符串中的模式并使用 sed 保存到新文件

Linux/Unix Replacing a pattern in a string and saving to a new file with sed

我有一个任务,要替换字符串中的特定模式。 到目前为止,我尝试了 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

P.s。这只是示例文件,在我使用的真实文件中,并非每一行都有单词 china ,有 100000 个字符串,假设大约 500 个有 china

你可以试试这个 sed 命令

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

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

sed  -i.bak 's/,\(.*china\)/,Tomas_proxy.lt\//' FileName 
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

她是 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/,然后打印所有行。

sed '/china/ s#,#,Tomas_proxy.lt/#' YourFile

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