Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux/Unix替换字符串中的模式并使用sed保存到新文件_Linux_Design Patterns_Sed - Fatal编程技术网

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

Linux/Unix替换字符串中的模式并使用sed保存到新文件,linux,design-patterns,sed,Linux,Design Patterns,Sed,我有一个任务,替换字符串中的特定模式。 到目前为止,我尝试了像sed-e的/text\u to\u find/text\u to\u replace/g'file这样的命令 但我不知道为什么它改变了所有的字符串,而不仅仅是我想改变的部分 我要做的是在每个包含单词china的字符串中添加这个Tomas\u proxy.lt 为了明确起见,我正在寻找的是我正在使用的文件: 987173,businesswirechina.com 988254,chinacfa.com 988808,1012chin

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

我要做的是在每个包含单词
china
的字符串中添加这个
Tomas\u 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
您可以尝试这个
sed
命令

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

在匹配
中国
/
中国
(如果不想进行案例检查,请更改)的所有行中,将第一个
替换为
,Tomas\u proxy.lt/
。输出重定向到
新的\u文件

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


Her是一个
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
搜索
中国
,如果找到,将
替换为
,Tomas_proxy.lt/
,然后打印所有行

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

根据您的示例,假设第一个
是在行中插入文本的位置,在我尝试此操作之前,它会将更改保存到新文件吗?您必须将输出重定向到新文件,或者您可以使用
-I
选项对当前文件进行更改。请参阅我的更新答案。我可以请您解释一下吗,如果我理解正确的话,
[Cc]hina
代表中国和中国,
s/,
代表分隔符-我不确定,接下来,如果我想请你一步一步地为新手解释ti,为什么在这个命令的末尾会出现双
/
。?:)如果我错了,告诉我。
[Cc]hina
站在中国&China
s/,
找到要搜索的分隔符?我不太清楚这个命令的开头,主要是部分
/s/,/,
谢谢你的帮助。好的。:-。1) [Ch]ina=>要么是“中国”/“中国”。2) 替换的一般格式为sed的/pattern\u tobe\u replaced/new\u pattern/。另一种格式是sed'/pattern\u present/s/pattern\u tobe\u replacement/new\u pattern/,其中仅当行中有“pattern\u present”时才进行替换。这是我们在这里使用的格式。如果[Cc]中国在场,则进行替换。将“,”替换为“,”Tomas_proxy.lt/”。我们可以从一般模式中看出这一点。转义“Tomas\u proxy.lt/”=>“Tomas\u proxy.lt\/”中的“/”。有关“sed”的详细信息:。希望有帮助。。呸……我累了
sed '/[Cc]hina/s/,/,Tomas_proxy.lt\//' File > New_File
sed -i '/[Cc]hina/s/,/,Tomas_proxy.lt\//' File
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
sed '/china/ s#,#,Tomas_proxy.lt/#' YourFile