我有一个文件说12
,其内容为
$ cat 12
rajesh jain
amit jain
xi11 vddp vss log0 log1 md72a7l_logrepw mfactor='1*mfactor'
1234
5678
我有变量a
& b
喜欢:
$ echo $a
xi11 vddp vss log0 log1 md72a7l_logrepw mfactor='1*mfactor'
$ echo $b
xi11 vddp vss log0 log1 md72a7l_logrepw mfactor='2*mfactor'
我想将变量a
替换为文件b
中的12
当我发出命令时:
cat 12 |sed -e "s/$a/$b/g"
无法替换模式
我正在制作一个文件&变量值不断变化所以我不能 将文字字符串保留在模式中以进行搜索。
请帮助。
由于 拉杰什
答案 0 :(得分:2)
这适用于a
和b
的任何内容,因为它只适用于字符串,而非RE:
awk -v a="$a" -v b="$b" 's=index($0,a){$0=substr($0,1,s-1) b substr($0,s+length(a))}1' file
话虽如此,例如,如果$a
可以包含您不想扩展的反斜杠(例如,如果您希望将\t
视为字面上的反斜杠,那么字母为t
而不是制表符),那么你需要这样做:
awk -v b="$b" 'BEGIN{a=ARGV[--ARGC]; delete ARGV[ARGC]}
s=index($0,a){$0=substr($0,1,s-1) b substr($0,s+length(a))}1' file "$a"
有关将shell变量的值传递给awk脚本的更多详细信息,请参阅http://cfajohnson.com/shell/cus-faq-2.html#Q24。
答案 1 :(得分:1)
您可以预处理模式以转义所有特殊字符:
a_esc=$(echo "$a" | sed 's/[][*}{]/\\&/g')
然后在替换中使用它:
$ sed "s/${a_esc}/${b}/" 12
rajesh jain
amit jain
xi11 vddp vss log0 log1 md72a7l_logrepw mfactor='2*mfactor'
1234
5678
答案 2 :(得分:0)
您可以将perl
与\Q
和\E
序列结合使用。 \Q
告诉perl
开始转义特殊字符的位置,\E
告诉它停止的位置。
$ perl -pe "s/\Q$a\E/$b/" 12
rajesh jain
amit jain
xi11 vddp vss log0 log1 md72a7l_logrepw mfactor='2*mfactor'
1234
5678