使用变量将包含星号的模式替换为其他模式

时间:2014-05-11 14:59:57

标签: shell sed

我有一个文件说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" 

无法替换模式

我正在制作一个文件&变量值不断变化所以我不能 将文字字符串保留在模式中以进行搜索。

请帮助。

由于 拉杰什

3 个答案:

答案 0 :(得分:2)

这适用于ab的任何内容,因为它只适用于字符串,而非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