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

11

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

4个回答

17

您可以尝试这个 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 

1
在我尝试之前,它会将更改保存到新文件中吗? - DevyDev
你必须将输出重定向到新文件,或者可以在当前文件中使用“-i”选项进行更改。请查看我的更新答案。 - Kalanidhi
1
您能否更新您的答案,以澄清每个命令的确切行为?这三个命令是否完全相同? - Michiel Haisma

0
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是指中国,chinas/,是指分隔符 - 不太确定,接下来,为什么在这个命令的结尾有双重// - DevyDev
如果我让你为新手逐步解释它,你会怎么说? :) 告诉我是否错误,[Cc]hina代表中国和瓷器,s/,用于查找分隔符。? 我对这个命令的开头部分不是很确定,尤其是/s/,/,部分。谢谢你帮助我。 - DevyDev
好的。 :-)。1)[Ch]ina => 要么是“中国”/“china”。2)替换的一般格式为sed 's/待替换模式/新模式/'。另一种格式为sed '/存在模式/s/待替换模式/新模式/',仅在行中存在“存在模式”时进行替换。这是我们在这里使用的格式。如果存在 [Cc]hina,则进行替换。用 ",Tomas_proxy.lt/" 替换 ","。可以从通用模式中找出来的。在 "Tomas_proxy.lt/" 中转义 "/" => "Tomas_proxy.lt/"。有关 "sed" 的更多信息:http://www.grymoire.com/Unix/Sed.html。希望有所帮助...咕噜噜的 :D :D - Arjun Mathew Dan

0

Her is an awk version:

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


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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接