Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Bash 搜索和替换多个引用_Bash_Shell_Sed - Fatal编程技术网

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