2015-07-11 112 views
2

所以我有一个包含数百万行的文件。
现在的文件中我有发生,如搜索并替换多个匹配项

=Continent 
=Country 
=State 
=City 
=Street 

现在我有我有应该替换这些事件文本的Excel文件 - 作为一个例子:
=大陆应及时更换与=亚洲
同样,对于其他文本

现在,我想编写一个Java程序来阅读我的输入文件,读取映射文件,并且每次出现搜索和替换。
我在这里很懒 - 想知道是否可以使用像VIM这样的编辑器做同样的事情? 会是可能的吗?
注 - 我不想做一个单一的文本替换 - 我有多个文本需要被发现和替换,我不想做搜索和手动替换每个。

EDIT1:
内容我的文件,我想更换: “的1.txt

continent=cont_text 
country=country_text 

包含我要替换的值的文件:“to_replace。 TXT

=cont_text~Asia 
=country_text~India 

,最后用‘sed的’这里是我的sh文件 - 但我做的事情错了 - 它不会取代“的1.txt”

while IFS="~" read foo bar; 
do 
echo $foo 
echo $bar 
for filename in 1.txt; do 
    sed -i.backup 's/$foo/$bar/g;' $filename 
done 
done < to_replace.txt 
+0

对于初学者来说,你至少该文本从您的Excel导出文件的一些理智的格式(CSV?),它装入一个Vim缓冲区或将其保存到一个文件中,并显示了我们一个样本。或者,您可以通过说明您的excel文件具有未知密码并位于不能连接到的其他机器上,使问题更加复杂:P – VanLaser

+0

:)请参阅我的编辑并提供完整详细信息 - tx –

回答

2

的你不能把$foo$bar单引号中的内容,因为外壳将不会展开。您不需要for $filename in 1.txt回路,因为sed将循环通过1.txt的行。并且您不能在循环内使用-i.backup,因为它每次都会更改备份文件,而不会保留原始文件。所以,你的脚本应该是:

#!/bin/bash 
cp 1.txt 1.txt.backup 
while IFS="~" read foo bar; 
do 
    echo $foo 
    echo $bar 
    sed -i "s/$foo/=$bar/g;" 1.txt 
done < to_replace.txt 

输出:

$ cat 1.txt 
continent=Asia 
country=India 
+0

谢谢!这工作完美 –

+1

这取决于你的输入文件的内容和你执行目录的内容,会以各种有趣的方式失败。每当你在shell中编写一个循环来操纵文本时,你都会有错误的方法。 –

0

sed的是个别线路与外壳的简单替代是从中调用工具不是一个工具来操作文本,以便任何时候你的环境编写一个shell循环来操纵你正在做错的文本。

只需使用的工具,谁发明sed和外壳一样的家伙还发明了做普通文本处理类似的职位,AWK:

​​3210
0

sed命令将做到这一点没有任何循环:

sed -n 's#\(^=[^~]*\)~\(.*\)#s/\1/=\2/g#p' to_replace.txt |sed -i -f- 1.txt 

或者sed具有扩展的正则表达式:

sed -nr 's#(^=[^~]*)~(.*)#s/\1/=\2/g#p' to_replace.txt | sed -i -f- 1.txt 

说明:

sed的命令:

sed -n 's#\(^=[^~]*\)~\(.*\)#s/\1/=\2/g#p' to_replace.txt 

产生输出:

s/=cont_text/=Asia/g 
s/=country_text/=India/g 

,然后将其用作sed脚本用于下一sed管道之后。


$ cat 1.txt 
continent=Asia 
country=India