Bash 搜索和替换多个引用
所以我有一个包含数百万行的文件。Bash 搜索和替换多个引用,bash,shell,sed,Bash,Shell,Sed,所以我有一个包含数百万行的文件。 现在,在文件中,我出现了如下事件 =Continent =Country =State =City =Street 现在,我有了一个excel文件,其中的文本应该替换这些事件,例如: =大陆应替换为亚洲 其他文本也是如此 现在我正在考虑编写一个java程序来读取我的输入文件,读取映射文件,并对每个事件进行搜索和替换。 我在这里很懒——我想知道我是否可以用VIM这样的编辑器来做同样的事情? 有可能吗? 注意-我不想做一个单一的文本替换-我有多个文本需要找到和替换
现在,在文件中,我出现了如下事件
=Continent
=Country
=State
=City
=Street
现在,我有了一个excel文件,其中的文本应该替换这些事件,例如:=大陆应替换为亚洲
其他文本也是如此 现在我正在考虑编写一个java程序来读取我的输入文件,读取映射文件,并对每个事件进行搜索和替换。
我在这里很懒——我想知道我是否可以用VIM这样的编辑器来做同样的事情? 有可能吗?
注意-我不想做一个单一的文本替换-我有多个文本需要找到和替换,我不想做搜索和手动替换每一个 EDIT1:
我要替换的文件内容:“1.txt” 包含要替换为的值的文件:“to_replace.txt” 最后,在这里使用'sed'是我的.sh文件-但我做错了-它不能替换“1.txt”的内容
当IFS=“~”读取foo条时;
做
回声$foo
echo$bar
文件名为1.txt;做
sed-i.backup's/$foo/$bar/g;'$文件名
完成
完成
不能将$foo
和$bar
放在单引号中,因为shell不会展开它们。在1.txt中,$filename不需要循环,因为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
sed用于在单独的行上进行简单的替换,shell是一个调用工具的环境,而不是一个操作文本的工具,因此每当您编写shell循环来操作文本时,您都犯了错误
只需使用发明sed和shell的人也发明的工具来做一般的文本处理工作,比如,awk:
$ awk -F'[=~]' -v OFS="=" 'NR==FNR{map[$2]=$3;next} {$2=map[$2]} 1' to_replace.txt 1.txt
continent=Asia
country=India
此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
对于初学者,您至少可以将excel文件中的文本导出为某种sane格式(csv?),将其加载到Vim缓冲区中,或者将其保存到文件中,并向我们展示一个示例。或您可以通过声明您的excel文件具有未知密码,并且位于无法连接到的另一台计算机上,从而使问题更加复杂:P:)请查看我的编辑,并提供完整的详细信息-TXT将以各种有趣的方式失败,具体取决于输入文件的内容和您执行的目录的内容它来自于。每当您在shell中编写循环来处理文本时,您的方法都是错误的。
sed -n 's#\(^=[^~]*\)~\(.*\)#s/\1/=\2/g#p' to_replace.txt |sed -i -f- 1.txt
sed -nr 's#(^=[^~]*)~(.*)#s/\1/=\2/g#p' to_replace.txt | sed -i -f- 1.txt
sed -n 's#\(^=[^~]*\)~\(.*\)#s/\1/=\2/g#p' to_replace.txt
s/=cont_text/=Asia/g
s/=country_text/=India/g
$ cat 1.txt
continent=Asia
country=India